/* *************************************************************************************** * 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; import com.espertech.esper.client.ConfigurationException; import com.espertech.esper.client.EPException; import com.espertech.esper.client.EPServiceProviderManager; import com.espertech.esper.core.service.EPServiceProviderSPI; import com.espertech.esperio.socket.config.ConfigurationSocketAdapter; import com.espertech.esperio.socket.config.SocketConfig; import com.espertech.esperio.socket.core.EsperSocketService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class EsperIOSocketAdapter { private static Logger log = LoggerFactory.getLogger(EsperIOSocketAdapter.class); private final ConfigurationSocketAdapter config; private final String engineURI; private final Map<String, EsperSocketService> sockets = new HashMap<String, EsperSocketService>(); /** * Quickstart constructor. * * @param config configuration * @param engineURI engine URI */ public EsperIOSocketAdapter(ConfigurationSocketAdapter config, String engineURI) { this.config = config; this.engineURI = engineURI; } /** * Re-initialize. */ public void initialize() { } /** * Start the socket endpoint. */ public synchronized void start() { if (log.isInfoEnabled()) { log.info("Starting EsperIO Socket Adapter for engine URI '" + engineURI + "'"); } EPServiceProviderSPI engineSPI = (EPServiceProviderSPI) EPServiceProviderManager.getExistingProvider(engineURI); // Configure sockets (input adapter) Set<Integer> ports = new HashSet<Integer>(); for (Map.Entry<String, SocketConfig> entry : config.getSockets().entrySet()) { if (sockets.containsKey(entry.getKey())) { throw new ConfigurationException("A socket by name '" + entry.getKey() + "' has already been configured."); } int port = entry.getValue().getPort(); if (ports.contains(port)) { throw new ConfigurationException("A socket for port '" + port + "' has already been configured."); } ports.add(port); EsperSocketService socketService = new EsperSocketService(entry.getKey(), entry.getValue()); sockets.put(entry.getKey(), socketService); } // Start sockets for (Map.Entry<String, EsperSocketService> entry : sockets.entrySet()) { try { entry.getValue().start(entry.getKey(), engineSPI); } catch (IOException e) { String message = "Error starting socket '" + entry.getKey() + "' port " + entry.getValue().getPort() + " :" + e.getMessage(); log.error(message, e); throw new EPException(message, e); } } if (log.isInfoEnabled()) { log.info("Completed starting EsperIO Socket Adapter for engine URI '" + engineURI + "'."); } } /** * Destroy the adapter. */ public synchronized void destroy() { if (log.isDebugEnabled()) { log.debug("Destroying Esper Socket Adapter"); } for (EsperSocketService service : sockets.values()) { try { service.destroy(); } catch (Throwable t) { log.info("Error destroying service '" + service.getServiceName() + "' :" + t.getMessage()); } } sockets.clear(); } }