/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esperio.http.core; import org.apache.http.impl.DefaultHttpServerConnection; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InterruptedIOException; import java.net.ServerSocket; import java.net.Socket; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class EsperHttpServiceClassicRunnable implements Runnable { private static Logger log = LoggerFactory.getLogger(EsperHttpServiceClassicRunnable.class); private String serviceName; private ServerSocket serversocket; private HttpParams parameters; private HttpService httpService; private List<WorkerThread> workers = new CopyOnWriteArrayList<WorkerThread>(); private boolean shutdown; public EsperHttpServiceClassicRunnable(String serviceName, ServerSocket serversocket, HttpParams parameters, HttpService httpService) { this.serviceName = serviceName; this.serversocket = serversocket; this.parameters = parameters; this.httpService = httpService; } public void run() { log.info("For service '" + serviceName + "' listening on port " + this.serversocket.getLocalPort()); while (!Thread.interrupted()) { try { // Set up HTTP connection Socket socket = this.serversocket.accept(); DefaultHttpServerConnection conn = new DefaultHttpServerConnection(); log.info("Incoming connection service '" + serviceName + "' from " + socket.getInetAddress()); conn.bind(socket, this.parameters); // Start worker thread WorkerThread t = new WorkerThread(this.httpService, conn, this); t.setDaemon(true); t.start(); workers.add(t); } catch (InterruptedIOException ex) { break; } catch (IOException e) { if (!shutdown) { log.error("I/O error initialising connection thread for service '" + serviceName + "' : " + e.getMessage()); } break; } } log.info("For service '" + serviceName + "' listening on port " + this.serversocket.getLocalPort() + " ended socket thread."); } public void destroy() { log.info("Stopping worker threads for service '" + serviceName + "'"); shutdown = true; for (WorkerThread worker : workers) { worker.setShutdown(true); if (!worker.isAlive()) { worker.interrupt(); } try { worker.join(1000); } catch (InterruptedException e) { } } workers.clear(); } public void remove(WorkerThread workerThread) { workers.remove(workerThread); } }