/*
***************************************************************************************
* 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.socket.core;
import com.espertech.esper.core.service.EPServiceProviderSPI;
import com.espertech.esperio.socket.config.SocketConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
public class EsperSocketService {
private static Logger log = LoggerFactory.getLogger(EsperSocketService.class);
private final String serviceName;
private final SocketConfig serviceConfig;
private ServerSocket serverSocket;
private EsperSocketServiceRunnable runnable;
private Thread socketThread;
public EsperSocketService(String serviceName, SocketConfig serviceConfig) {
this.serviceName = serviceName;
this.serviceConfig = serviceConfig;
}
public String getServiceName() {
return serviceName;
}
public void start(String serviceName, EPServiceProviderSPI engineSPI) throws IOException {
if (serviceConfig.getHostname() != null) {
InetAddress inetAddress = InetAddress.getByName(serviceConfig.getHostname());
int backlog = serviceConfig.getBacklog() == null ? 2 : serviceConfig.getBacklog();
log.info("Esper socket adapter accepting connections on port " + serviceConfig.getPort() + " and host '" + serviceConfig.getHostname() + "' backlog " + backlog + " for socket named '" + serviceName + "'");
serverSocket = new ServerSocket(serviceConfig.getPort(), backlog, inetAddress);
} else {
if (serviceConfig.getBacklog() != null) {
log.info("Esper socket adapter accepting connections on port " + serviceConfig.getPort() + " backlog " + serviceConfig.getBacklog() + " for socket named '" + serviceName + "'");
serverSocket = new ServerSocket(serviceConfig.getPort(), serviceConfig.getBacklog());
} else {
log.info("Esper socket adapter accepting connections on port " + serviceConfig.getPort() + " for socket named '" + serviceName + "'");
serverSocket = new ServerSocket(serviceConfig.getPort());
}
}
runnable = new EsperSocketServiceRunnable(this.getServiceName(), this.serviceConfig, serverSocket, engineSPI);
socketThread = new Thread(runnable);
socketThread.setDaemon(true);
socketThread.start();
}
public void destroy() {
log.info("Closing existing workers for service '" + this.getServiceName() + "'");
runnable.destroy();
log.info("Closing server socket for service '" + this.getServiceName() + "' and port " + serviceConfig.getPort());
try {
serverSocket.close();
} catch (IOException e) {
log.debug("Error closing server socket: " + e.getMessage(), e);
}
log.info("Stopping socket thread for service '" + this.getServiceName() + "'");
socketThread.interrupt();
try {
socketThread.join(10000);
} catch (InterruptedException e) {
log.debug("Interrupted", e);
}
}
public int getPort() {
return serviceConfig.getPort();
}
}