/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.transport.socket; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.net.Socket; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsg; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.transport.FudgeMessageSender; import com.opengamma.util.ArgumentChecker; // REVIEW kirk 2010-05-12 -- Enhancements here: // - Keepalive on connection failing // - Multiple remote endpoints /** * Accepts messages and dispatches them to a remote {@link ServerSocketFudgeMessageReceiver}. * On lifecycle startup this class will open a remote connection to the other side, * and maintain that until {@link #stop()} is invoked to terminate the socket. * */ public class SocketFudgeMessageSender extends AbstractSocketProcess implements FudgeMessageSender { private static final Logger s_logger = LoggerFactory.getLogger(SocketFudgeMessageSender.class); private final FudgeContext _fudgeContext; private MessageBatchingWriter _writer; public SocketFudgeMessageSender() { this(FudgeContext.GLOBAL_DEFAULT); } public SocketFudgeMessageSender(FudgeContext fudgeContext) { ArgumentChecker.notNull(fudgeContext, "fudgeContext"); _fudgeContext = fudgeContext; } @Override public FudgeContext getFudgeContext() { return _fudgeContext; } /** * Note that a return from a call to {@link #send} does not guarantee the message has been * received, or even sent. There may be buffering on the transport but also we batch * messages up to a single thread if this is called concurrently. * * @param message message to send */ @Override public void send(FudgeMsg message) { startIfNecessary(); s_logger.info("Sending message with {} fields", message.getNumFields()); _writer.write(message); } @Override protected void socketClosed() { super.socketClosed(); _writer = null; } @Override protected void socketOpened(Socket socket, BufferedOutputStream os, BufferedInputStream is) { _writer = new MessageBatchingWriter(getFudgeContext(), os); } }