1 52 53 package com.go.trove.net; 54 55 import java.net.*; 56 import java.util.*; 57 58 71 public class MultiPooledSocketFactory extends DistributedSocketFactory { 72 private Object [] mResolvers; 74 75 81 public MultiPooledSocketFactory(String [] hosts, 82 int[] ports, 83 long timeout) { 84 super(timeout); 85 86 try { 87 mResolvers = new InetAddressResolver[hosts.length]; 88 for (int i=0; i<hosts.length; i++) { 89 Listener listener = new Listener(ports[i], timeout); 90 mResolvers[i] = 91 InetAddressResolver.listenFor(hosts[i], listener); 92 } 93 } 94 catch (NoClassDefFoundError e) { 95 mResolvers = null; 98 for (int i=0; i<hosts.length; i++) { 99 Listener listener = new Listener(ports[i], timeout); 100 try { 101 listener.resolved(InetAddress.getAllByName(hosts[i])); 102 } 103 catch (UnknownHostException e2) { 104 listener.unknown(e2); 105 } 106 } 107 } 108 } 109 110 115 protected SocketFactory createSocketFactory(InetAddress address, 116 int port, long timeout) 117 { 118 SocketFactory factory; 119 factory = new PlainSocketFactory(address, port, timeout); 120 factory = new PooledSocketFactory(factory); 121 factory = new LazySocketFactory(factory); 122 return factory; 123 } 124 125 private class Listener implements InetAddressListener { 126 private final int mPort; 127 private final long mTimeout; 128 129 private Map mAddressedFactories; 131 132 public Listener(int port, long timeout) { 133 mPort = port; 134 mTimeout = timeout; 135 mAddressedFactories = new HashMap(); 136 } 137 138 public void unknown(UnknownHostException e) { 139 Thread t = Thread.currentThread(); 140 t.getThreadGroup().uncaughtException(t, e); 141 142 Iterator it = mAddressedFactories.keySet().iterator(); 144 while (it.hasNext()) { 145 SocketFactory factory = 146 (SocketFactory)mAddressedFactories.get(it.next()); 147 removeSocketFactory(factory); 148 } 149 } 150 151 public void resolved(InetAddress[] addresses) { 152 for (int i=0; i<addresses.length; i++) { 154 InetAddress address = addresses[i]; 155 if (!mAddressedFactories.containsKey(address)) { 156 SocketFactory factory = 157 createSocketFactory(address, mPort, mTimeout); 158 mAddressedFactories.put(address, factory); 159 addSocketFactory(factory); 160 } 161 } 162 163 Iterator it = mAddressedFactories.keySet().iterator(); 165 mainLoop: 166 while (it.hasNext()) { 167 InetAddress address = (InetAddress)it.next(); 168 for (int i=0; i<addresses.length; i++) { 169 if (addresses[i].equals(address)) { 170 continue mainLoop; 171 } 172 } 173 SocketFactory factory = 174 (SocketFactory)mAddressedFactories.get(address); 175 removeSocketFactory(factory); 176 } 177 } 178 } 179 } 180 | Popular Tags |