1 23 24 package org.continuent.sequoia.controller.core; 25 26 import java.io.IOException ; 27 import java.net.InetAddress ; 28 import java.net.ServerSocket ; 29 import java.net.Socket ; 30 import java.util.ArrayList ; 31 32 import javax.net.ServerSocketFactory; 33 34 import org.continuent.sequoia.common.i18n.Translate; 35 import org.continuent.sequoia.common.log.Trace; 36 import org.continuent.sequoia.common.net.SSLException; 37 import org.continuent.sequoia.common.net.SocketFactoryFactory; 38 39 49 public class ControllerServerThread extends Thread 50 { 51 private ServerSocket serverSocket; 52 private boolean isShuttingDown = false; 53 protected Controller controller; 54 55 protected ArrayList controllerServerThreadPendingQueue = new ArrayList (); 56 60 protected int idleWorkerThreads = 0; 61 62 63 static Trace logger = Trace 64 .getLogger("org.continuent.sequoia.controller.core.Controller"); 65 66 static Trace endUserLogger = Trace 67 .getLogger("org.continuent.sequoia.enduser"); 68 69 74 public ControllerServerThread(Controller controller) 75 { 76 super("ControllerServerThread"); 77 this.controller = controller; 78 79 try 80 { 81 InetAddress bindAddress = InetAddress 82 .getByName(controller.getIPAddress()); 83 84 89 if (!controller.getIPAddress().equals( 90 InetAddress.getLocalHost().getHostAddress())) 91 { 95 if (controller.getSslConfiguration() != null) 100 { 101 ServerSocketFactory sslFact = SocketFactoryFactory 102 .createServerFactory(controller.getSslConfiguration()); 103 serverSocket = sslFact.createServerSocket(controller 104 .getJdbcPortNumber(), controller.getBacklogSize(), bindAddress); 105 } 106 else 107 { 108 serverSocket = new ServerSocket (controller.getJdbcPortNumber(), 109 controller.getBacklogSize(), bindAddress); 110 } 111 } 112 else 113 { 116 if (controller.getSslConfiguration() != null) 117 { 118 ServerSocketFactory sslFact = SocketFactoryFactory 119 .createServerFactory(controller.getSslConfiguration()); 120 serverSocket = sslFact.createServerSocket(controller 121 .getJdbcPortNumber(), controller.getBacklogSize()); 122 } 123 else 124 { 125 serverSocket = new ServerSocket (controller.getJdbcPortNumber(), 126 controller.getBacklogSize()); 127 } 128 } 129 130 } 131 catch (java.net.BindException e) 132 { String msg = Translate.get("controller.server.thread.illegal.ip", 134 new String []{controller.getIPAddress(), e.getMessage()}); 135 logger.fatal(msg); 136 endUserLogger.fatal(msg); 137 controller.endOfController(e); 138 } 139 catch (IOException e) 140 { 141 String msg = Translate.get("controller.server.thread.socket.failed", 142 new String []{String.valueOf(controller.getJdbcPortNumber()), 143 e.getMessage()}); 144 if (logger.isDebugEnabled()) 145 logger.fatal(msg, e); 146 else 147 logger.fatal(msg); 148 endUserLogger.fatal(msg); 149 controller.endOfController(e); 150 } 151 catch (SSLException e) 152 { 153 String msg = Translate.get("controller.server.thread.socket.failed", 154 new String []{String.valueOf(controller.getJdbcPortNumber()), 155 e.getMessage()}); 156 if (logger.isDebugEnabled()) 157 logger.fatal(msg, e); 158 else 159 logger.fatal(msg); 160 endUserLogger.fatal(msg); 161 controller.endOfController(e); 162 } 163 if (logger.isInfoEnabled()) 164 { 165 logger.info(Translate.get("controller.server.thread.waiting.connections", 166 new String []{serverSocket.getInetAddress().getHostAddress(), 167 String.valueOf(serverSocket.getLocalPort())})); 168 logger.debug(Translate.get("controller.server.thread.backlog.size", "" 169 + controller.getBacklogSize())); 170 } 171 } 172 173 177 public void run() 178 { 179 if (controller == null) 180 { 181 logger.error(Translate.get("controller.server.thread.controller.null")); 182 isShuttingDown = true; 183 } 184 185 Socket clientSocket = null; 186 while (!isShuttingDown) 187 { 188 try 189 { clientSocket = serverSocket.accept(); 191 if (isShuttingDown) 192 break; 193 194 197 boolean createThread = false; 198 if (isShuttingDown) 199 break; 200 synchronized (controllerServerThreadPendingQueue) 201 { 202 controllerServerThreadPendingQueue.add(clientSocket); 204 if (idleWorkerThreads == 0) 207 createThread = true; 208 else 209 controllerServerThreadPendingQueue.notifyAll(); 214 } 215 if (createThread) 216 { ControllerWorkerThread thread = new ControllerWorkerThread(this); 218 thread.start(); 219 if (logger.isDebugEnabled()) 220 logger.debug(Translate.get("controller.server.thread.starting")); 221 } 222 } 223 catch (IOException e) 224 { 225 if (!isShuttingDown) 226 { 227 logger.warn(Translate.get( 228 "controller.server.thread.new.connection.error", e), e); 229 } 230 } 231 } 232 if (logger.isInfoEnabled()) 233 logger.info(Translate.get("controller.server.thread.terminating")); 234 } 235 236 239 public void shutdown() 240 { 241 isShuttingDown = true; 242 try 244 { 245 serverSocket.close(); 246 } 247 catch (Exception e) 248 { 249 logger.warn(Translate.get("controller.shutdown.server.socket.exception"), 250 e); 251 } 252 253 257 Object lock = controllerServerThreadPendingQueue; 258 synchronized (lock) 259 { 260 int nbSockets = controllerServerThreadPendingQueue.size(); 262 Socket socket = null; 263 for (int i = 0; i < nbSockets; i++) 264 { 265 socket = (Socket ) controllerServerThreadPendingQueue.get(i); 266 logger.info(Translate.get("controller.shutdown.client.socket", socket 267 .getInetAddress().toString())); 268 269 try 270 { 271 socket.close(); 272 } 273 catch (Exception e) 274 { 275 logger.warn(Translate 276 .get("controller.shutdown.client.socket.exception"), e); 277 } 278 } 279 280 this.controllerServerThreadPendingQueue = null; 283 lock.notifyAll(); 284 } 285 } 286 287 290 public int getControllerServerThreadPendingQueueSize() 291 { 292 synchronized (controllerServerThreadPendingQueue) 293 { 294 return controllerServerThreadPendingQueue.size(); 295 } 296 } 297 298 301 public int getIdleWorkerThreads() 302 { 303 synchronized (controllerServerThreadPendingQueue) 304 { 305 return idleWorkerThreads; 306 } 307 } 308 309 314 public boolean isShuttingDown() 315 { 316 return isShuttingDown; 317 } 318 } | Popular Tags |