KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > server > transport > nio > tcp > NioTcpClientConnectionPool


1 package org.sapia.ubik.rmi.server.transport.nio.tcp;
2
3 import java.rmi.RemoteException JavaDoc;
4 import java.util.ArrayList JavaDoc;
5 import java.util.Hashtable JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8 import java.util.Map JavaDoc;
9
10 import org.sapia.taskman.PeriodicTaskDescriptor;
11 import org.sapia.taskman.Task;
12 import org.sapia.taskman.TaskContext;
13 import org.sapia.ubik.net.Connection;
14 import org.sapia.ubik.net.ConnectionPool;
15 import org.sapia.ubik.net.DefaultClientSocketFactory;
16 import org.sapia.ubik.net.ServerAddress;
17 import org.sapia.ubik.net.TCPAddress;
18 import org.sapia.ubik.rmi.server.Hub;
19 import org.sapia.ubik.rmi.server.transport.Connections;
20 import org.sapia.ubik.rmi.server.transport.RmiConnection;
21
22 /**
23  * Implements a pool of client-side <code>SocketConnection</code> instances.
24  * It multiplexes the pooled connections among multiple callers.
25  *
26  * @author Yanick Duchesne
27  * <dl>
28  * <dt><b>Copyright: </b>
29  * <dd>Copyright &#169; 2002-2005 <a
30  * HREF="http://www.sapia-oss.org">Sapia Open Source Software </a>. All
31  * Rights Reserved.</dd>
32  * </dt>
33  * <dt><b>License: </b>
34  * <dd>Read the license.txt file of the jar or visit the <a
35  * HREF="http://www.sapia-oss.org/license.html">license page </a> at the
36  * Sapia OSS web site</dd>
37  * </dt>
38  * </dl>
39  */

40 public class NioTcpClientConnectionPool implements Connections {
41   private static Map JavaDoc _pools = new Hashtable JavaDoc();
42   private static boolean _started;
43   ConnectionPool _pool;
44
45   /**
46    * Constructor for RMIClientConnectionPool.
47    *
48    * @param host
49    * the host of the server to connect to.
50    * @param port
51    * the port of the server.
52    */

53   NioTcpClientConnectionPool(String JavaDoc host, int port, int bufsize) {
54     _pool = new ConnectionPool(host, port, new NioRmiConnectionFactory(bufsize),
55         new DefaultClientSocketFactory());
56   }
57
58   /**
59    * @see org.sapia.ubik.rmi.server.transport.Connections#acquire()
60    */

61   public RmiConnection acquire() throws RemoteException JavaDoc {
62     try {
63       return (RmiConnection) _pool.acquire();
64     } catch(java.io.IOException JavaDoc e) {
65       throw new RemoteException JavaDoc("Could not acquire a connection", e);
66     }
67   }
68
69   /**
70    * @see org.sapia.ubik.rmi.server.transport.Connections#release(Connection)
71    */

72   public void release(Connection conn) {
73     _pool.release(conn);
74   }
75
76   /**
77    * @see org.sapia.ubik.rmi.server.transport.Connections#clear()
78    */

79   public void clear() {
80     _pool.shrinkTo(0);
81   }
82
83   /**
84    * @see org.sapia.ubik.rmi.server.transport.Connections#getTransportType()
85    */

86   public String JavaDoc getTransportType() {
87     return NioTcpTransportProvider.TRANSPORT_TYPE;
88   }
89
90   ConnectionPool internalPool() {
91     return _pool;
92   }
93
94   static synchronized void shutdown() {
95     NioTcpClientConnectionPool pool;
96     Iterator JavaDoc pools;
97
98     if(_started) {
99       synchronized(_pools) {
100         pools = _pools.values().iterator();
101
102         while(pools.hasNext()) {
103           pool = (NioTcpClientConnectionPool) pools.next();
104           pool.internalPool().shrinkTo(0);
105         }
106       }
107     }
108   }
109
110   static synchronized NioTcpClientConnectionPool getInstance(
111       ServerAddress address, int bufsize) {
112     if(!_started) {
113       _started = true;
114
115       List JavaDoc desc = new ArrayList JavaDoc();
116       desc.add(new PeriodicTaskDescriptor(NioTcpClientConnectionPool.class
117           .getName(), PoolCleaner.INTERVAL, new PoolCleaner(_pools)));
118       Hub.taskMan.addTaskDescriptors(desc);
119     }
120
121     NioTcpClientConnectionPool pool = (NioTcpClientConnectionPool) _pools
122         .get(address);
123
124     if(pool == null) {
125       pool = new NioTcpClientConnectionPool(((NioAddress) address).getHost(),
126           ((NioAddress) address).getPort(), bufsize);
127       _pools.put(address, pool);
128     }
129
130     return pool;
131   }
132
133   static synchronized void invalidate(TCPAddress id) {
134     _pools.remove(id);
135   }
136
137   /*
138    * ////////////////////////////////////////////////// INNER CLASSES
139    * //////////////////////////////////////////////////
140    */

141   static final class PoolCleaner implements Task {
142     static final long INTERVAL = 5000;
143     Map JavaDoc _pools;
144
145     PoolCleaner(Map JavaDoc pools) {
146       _pools = pools;
147     }
148
149     /**
150      * @see org.sapia.taskman.Task#exec(TaskContext)
151      */

152     public void exec(TaskContext context) {
153       NioTcpClientConnectionPool[] pools;
154
155       pools = (NioTcpClientConnectionPool[]) _pools.values().toArray(
156           new NioTcpClientConnectionPool[_pools.size()]);
157
158       for(int i = 0; i < pools.length; i++) {
159         if((System.currentTimeMillis() - pools[i].internalPool()
160             .getLastUsageTime()) > INTERVAL) {
161           context.getTaskOutput().debug(
162               "Shrinking nio socket client connection pool...");
163           pools[i].internalPool().shrinkTo(0);
164         }
165       }
166     }
167   }
168 }
169
Popular Tags