package storm.applications.spout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static storm.applications.constants.BaseConstants.BaseConf.*; import storm.applications.spout.parser.Parser; import storm.applications.util.config.ClassLoaderUtils; import storm.applications.util.stream.StreamValues; /** * * @author mayconbordin */ public class SocketSpout extends AbstractSpout { private static final Logger LOG = LoggerFactory.getLogger(SocketSpout.class); private static final int DEFAULT_PORT = 6860; protected Parser parser; private String host; private int port; private ServerSocket server; private BufferedReader reader; @Override protected void initialize() { String parserClass = config.getString(getConfigKey(SPOUT_PARSER)); parser = (Parser) ClassLoaderUtils.newInstance(parserClass, "parser", LOG); parser.initialize(config); host = config.getString(getConfigKey(SPOUT_SOCKET_HOST), null); port = config.getInt(getConfigKey(SPOUT_SOCKET_PORT), DEFAULT_PORT); try { if (host == null) { server = new ServerSocket(port); } else { server = new ServerSocket(port, 1, InetAddress.getByName(host)); } Socket connection = server.accept(); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); } catch (IOException ex) { LOG.error("SocketSpout error: " + ex.getMessage(), ex); throw new RuntimeException("SocketSpout error: " + ex.getMessage(), ex); } } @Override public void nextTuple() { while (true) { try { String packet = reader.readLine(); if (packet != null) { List<StreamValues> tuples = parser.parse(packet); if (tuples != null) { for (StreamValues values : tuples) collector.emit(values.getStreamId(), values); } } } catch (IOException ex) { LOG.error("SocketSpout error: " + ex.getMessage(), ex); throw new RuntimeException("SocketSpout error: " + ex.getMessage(), ex); } } } @Override public void close() { super.close(); try { server.close(); } catch (IOException ex) { LOG.error("Error while closing socket server", ex); } } }