/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.transport.jms; import javax.jms.BytesMessage; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; import javax.jms.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jms.listener.SessionAwareMessageListener; import com.opengamma.transport.ByteArrayRequestReceiver; import com.opengamma.util.ArgumentChecker; /** * A request dispatcher that uses JMS. * <p> * This is a simple implementation based on JMS. */ public class JmsByteArrayRequestDispatcher implements SessionAwareMessageListener<Message> { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(JmsByteArrayRequestDispatcher.class); /** * The underlying request receiver. */ private final ByteArrayRequestReceiver _underlying; /** * Creates an instance based on a request receiver. * * @param underlying the underlying request receiver, not null */ public JmsByteArrayRequestDispatcher(final ByteArrayRequestReceiver underlying) { ArgumentChecker.notNull(underlying, "underlying"); _underlying = underlying; } //------------------------------------------------------------------------- /** * @return the underlying */ public ByteArrayRequestReceiver getUnderlying() { return _underlying; } //------------------------------------------------------------------------- @Override public void onMessage(final Message message, final Session session) throws JMSException { final Destination replyTo = message.getJMSReplyTo(); if (replyTo == null) { throw new IllegalArgumentException("No JMSReplyTo destination set."); } final byte[] requestBytes = JmsByteArrayHelper.extractBytes(message); s_logger.debug("Dispatching request {} of size {} to underlying", message.getJMSMessageID(), requestBytes.length); final byte[] responseBytes = getUnderlying().requestReceived(requestBytes); s_logger.debug("Returning response of size {} to {}", responseBytes.length, replyTo); final MessageProducer mp = session.createProducer(replyTo); try { final BytesMessage bytesMessage = session.createBytesMessage(); bytesMessage.writeBytes(responseBytes); bytesMessage.setJMSCorrelationID(message.getJMSMessageID()); mp.send(bytesMessage); } finally { mp.close(); } } }