/**
* 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.fudgemsg.FudgeMsgEnvelope;
import org.fudgemsg.wire.FudgeMsgReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.transport.FudgeMessageReceiver;
import com.opengamma.transport.FudgeRequestSender;
import com.opengamma.util.ArgumentChecker;
/**
* Opens a raw socket with a remote site for RPC-style communications.
*/
public class SocketFudgeRequestSender extends AbstractSocketProcess implements FudgeRequestSender {
private static final Logger s_logger = LoggerFactory.getLogger(SocketFudgeRequestSender.class);
private final FudgeContext _fudgeContext;
/**
* Batch outgoing requests, not to get the benefits of offloading to another thread as we're going
* to block anyway on a response but to allow concurrent use of the sender to be batched so only
* one flush operation happens.
*/
private final MessageBatchingWriter _writer = new MessageBatchingWriter();
private FudgeMsgReader _msgReader;
public SocketFudgeRequestSender() {
this(FudgeContext.GLOBAL_DEFAULT);
}
public SocketFudgeRequestSender(FudgeContext fudgeContext) {
ArgumentChecker.notNull(fudgeContext, "fudgeContext");
_fudgeContext = fudgeContext;
}
@Override
public FudgeContext getFudgeContext() {
return _fudgeContext;
}
@Override
public void sendRequest(FudgeMsg request, FudgeMessageReceiver responseReceiver) {
startIfNecessary();
s_logger.debug("Dispatching request with {} fields", request.getNumFields());
_writer.write(request);
final FudgeMsgEnvelope response;
synchronized (_msgReader) {
response = _msgReader.nextMessageEnvelope();
}
if (response != null) {
s_logger.debug("Got response with {} fields", response.getMessage().getNumFields());
responseReceiver.messageReceived(getFudgeContext(), response);
}
}
@Override
protected void socketOpened(Socket socket, BufferedOutputStream os, BufferedInputStream is) {
_writer.setFudgeMsgWriter(getFudgeContext(), os);
_msgReader = getFudgeContext().createMessageReader(is);
}
@Override
protected void socketClosed() {
super.socketClosed();
_writer.setFudgeMsgWriter(null);
_msgReader = null;
}
}