⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pooledsender.java

📁 精通tomcat书籍原代码,希望大家共同学习
💻 JAVA
字号:
/* * Copyright 1999,2004-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.catalina.tribes.transport;import java.io.IOException;import java.util.List;/** * <p>Title: </p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2005</p> * * <p>Company: </p> * * @author not attributable * @version 1.0 */public abstract class PooledSender extends AbstractSender implements MultiPointSender {        private SenderQueue queue = null;    private int poolSize = 25;    public PooledSender() {        queue = new SenderQueue(this,poolSize);    }        public abstract DataSender getNewDataSender();        public DataSender getSender() {        return queue.getSender(getTimeout());    }        public void returnSender(DataSender sender) {        sender.keepalive();        queue.returnSender(sender);    }        public synchronized void connect() throws IOException {        //do nothing, happens in the socket sender itself        queue.open();        setConnected(true);    }        public synchronized void disconnect() {        queue.close();        setConnected(false);    }            public int getInPoolSize() {        return queue.getInPoolSize();    }    public int getInUsePoolSize() {        return queue.getInUsePoolSize();    }    public void setPoolSize(int poolSize) {        this.poolSize = poolSize;        queue.setLimit(poolSize);    }    public int getPoolSize() {        return poolSize;    }    public boolean keepalive() {        //do nothing, the pool checks on every return        return false;    }        //  ----------------------------------------------------- Inner Class    private class SenderQueue {        private int limit = 25;        PooledSender parent = null;        private List notinuse = null;        private List inuse = null;        private boolean isOpen = true;        public SenderQueue(PooledSender parent, int limit) {            this.limit = limit;            this.parent = parent;            notinuse = new java.util.LinkedList();            inuse = new java.util.LinkedList();        }        /**         * @return Returns the limit.         */        public int getLimit() {            return limit;        }        /**         * @param limit The limit to set.         */        public void setLimit(int limit) {            this.limit = limit;        }        /**         * @return         */        public int getInUsePoolSize() {            return inuse.size();        }        /**         * @return         */        public int getInPoolSize() {            return notinuse.size();        }        public synchronized DataSender getSender(long timeout) {            long start = System.currentTimeMillis();            while ( true ) {                if (!isOpen)throw new IllegalStateException("Queue is closed");                DataSender sender = null;                if (notinuse.size() == 0 && inuse.size() < limit) {                    sender = parent.getNewDataSender();                } else if (notinuse.size() > 0) {                    sender = (DataSender) notinuse.remove(0);                }                if (sender != null) {                    inuse.add(sender);                    return sender;                }//end if                long delta = System.currentTimeMillis() - start;                if ( delta > timeout && timeout>0) return null;                else {                    try {                        wait(Math.max(timeout - delta,1));                    }catch (InterruptedException x){}                }//end if            }        }        public synchronized void returnSender(DataSender sender) {            if ( !isOpen) {                sender.disconnect();                return;            }            //to do            inuse.remove(sender);            //just in case the limit has changed            if ( notinuse.size() < this.getLimit() ) notinuse.add(sender);            else try {sender.disconnect(); } catch ( Exception ignore){}            notify();        }        public synchronized void close() {            isOpen = false;            Object[] unused = notinuse.toArray();            Object[] used = inuse.toArray();            for (int i = 0; i < unused.length; i++) {                DataSender sender = (DataSender) unused[i];                sender.disconnect();            }//for            for (int i = 0; i < used.length; i++) {                DataSender sender = (DataSender) used[i];                sender.disconnect();            }//for            notinuse.clear();            inuse.clear();            notify();                    }        public synchronized void open() {            isOpen = true;            notify();        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -