/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.livedata.client; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.jms.core.JmsTemplate; import com.opengamma.livedata.LiveDataClient; import com.opengamma.transport.ByteArrayFudgeRequestSender; import com.opengamma.transport.jms.JmsByteArrayMessageSender; import com.opengamma.transport.jms.JmsByteArrayRequestSender; import com.opengamma.util.NamedThreadPoolFactory; import com.opengamma.util.SingletonFactoryBean; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.jms.JmsConnector; /** * Creates a {@link JmsLiveDataClient}. */ public class RemoteLiveDataClientFactoryBean extends SingletonFactoryBean<DistributedLiveDataClient> implements DisposableBean { private static final Logger s_logger = LoggerFactory.getLogger(RemoteLiveDataClientFactoryBean.class); private JmsConnector _jmsConnector; private String _subscriptionTopic; private String _entitlementTopic; private String _heartbeatTopic; private int _maxConcurrentRequests = Integer.MAX_VALUE; public void setJmsConnector(final JmsConnector jmsConnector) { _jmsConnector = jmsConnector; } public JmsConnector getJmsConnector() { return _jmsConnector; } public void setSubscriptionTopic(final String subscriptionTopic) { _subscriptionTopic = subscriptionTopic; } public String getSubscriptionTopic() { return _subscriptionTopic; } public void setEntitlementTopic(String entitlementTopic) { _entitlementTopic = entitlementTopic; } public String getEntitlementTopic() { return _entitlementTopic; } public void setHeartbeatTopic(String heartbeatTopic) { _heartbeatTopic = heartbeatTopic; } public String getHeartbeatTopic() { return _heartbeatTopic; } /** * Sets the maximum number of concurrent JMS requests that will be made. Each concurrent request requires a thread to be allocated. * * @param maxConcurrentRequests maximum requests - set to 0 or negative for unlimited */ public void setMaxConcurrentRequests(final int maxConcurrentRequests) { if (maxConcurrentRequests <= 0) { _maxConcurrentRequests = Integer.MAX_VALUE; } else { _maxConcurrentRequests = maxConcurrentRequests; } } /** * Returns the maximum number of concurrent JMS requests that will be made. Each concurrent request requires a thread to be allocated. * * @return maximum requests */ public int getMaxConcurrentRequests() { return _maxConcurrentRequests; } @Override protected DistributedLiveDataClient createObject() { final JmsTemplate jmsTemplate = getJmsConnector().getJmsTemplateTopic(); final int maxConcurrent = getMaxConcurrentRequests(); final ThreadPoolExecutor executor = new ThreadPoolExecutor(maxConcurrent, maxConcurrent, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadPoolFactory( "RemoteLiveDataClient")); final JmsByteArrayRequestSender jmsSubscriptionRequestSender = new JmsByteArrayRequestSender(getSubscriptionTopic(), jmsTemplate, executor); final ByteArrayFudgeRequestSender fudgeSubscriptionRequestSender = new ByteArrayFudgeRequestSender(jmsSubscriptionRequestSender); final JmsByteArrayRequestSender jmsEntitlementRequestSender = new JmsByteArrayRequestSender(getEntitlementTopic(), jmsTemplate, executor); final ByteArrayFudgeRequestSender fudgeEntitlementRequestSender = new ByteArrayFudgeRequestSender(jmsEntitlementRequestSender); final JmsLiveDataClient liveDataClient = new JmsLiveDataClient(fudgeSubscriptionRequestSender, fudgeEntitlementRequestSender, getJmsConnector(), OpenGammaFudgeContext.getInstance(), JmsLiveDataClient.DEFAULT_NUM_SESSIONS); liveDataClient.setFudgeContext(OpenGammaFudgeContext.getInstance()); if (getHeartbeatTopic() != null) { JmsByteArrayMessageSender jmsHeartbeatSender = new JmsByteArrayMessageSender(getHeartbeatTopic(), jmsTemplate); liveDataClient.setHeartbeatMessageSender(jmsHeartbeatSender); } liveDataClient.start(); s_logger.debug("Created and started live data client using {} subscription topic {}, entitlement topic {} and heartbeat topic {}", new Object[] {getJmsConnector().getClientBrokerUri(), getSubscriptionTopic(), getEntitlementTopic(), getHeartbeatTopic() }); return liveDataClient; } @Override public void destroy() { LiveDataClient ldc = getObject(); if (ldc != null) { ldc.close(); } } }