Hi everyone, I've recently been tasked with writing an application that should receive messages from an existing Spring application (a game server) that uses ActiveMQ. The game server currently sends messages on a queue called ${jms.queue.audit}, from which another application (called the "auditor") receives.
What I need to do is configure a new queue, parallell to the ${jms.queue.audit} queue, from which my new application can receive. The new application should receive exactly the same messages as the auditor. Since I'm new to both Spring, JMS and ActiveMQ, I first felt a bit lost. But I understand that what I need to is probably to configure a composite destination [1], let's call it ${jms.queue.game_events}, which fans out into two separate queues ${jms.queue.audit} and ${jms.queue.new_queue}. E.g. like this: ${jms.queue.game_events} ----> ${jms.queue.new_queue} | v ${jms.queue.audit} I'd then reconfigure the game server to send messages on the virtual queue ${jms.queue.game_events}, and they would be delivered both to my new application and to the auditor. Looking at the relevant section of the Spring XML configuration for the game server, it looks like: <!-- JMS Configuration --> <bean id="jmsFailoverConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="failover:tcp://${jms.host}:${jms.port}"/> <property name="copyMessageOnSend" value="false"/> </bean> <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://${jms.host}:${jms.port}"/> <property name="copyMessageOnSend" value="false"/> </bean> <!-- JVM Dispatch Bridge Broker --> <bean id="jvmBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop"> <property name="persistent" value="true"/> <property name="dataDirectory" value="${broker.store}"/> <property name="transportConnectorURIs"> <list> <value>vm://localhost</value> </list> </property> <property name="useJmx" value="false"/> <property name="jmsBridgeConnectors"> <list> <bean class="org.apache.activemq.network.jms.JmsQueueConnector"> <property name="outboundQueueConnectionFactory" ref="jmsFailoverConnectionFactory"/> <property name="outboundQueueBridges"> <list> <!-- audit --> <bean class="org.apache.activemq.network.jms.OutboundQueueBridge"> <constructor-arg value="${jms.queue.audit}"/> </bean> <!-- generic history --> <bean class="org.apache.activemq.network.jms.OutboundQueueBridge"> <constructor-arg value="${jms.queue.generichistory}"/> </bean> </list> </property> </bean> </list> </property> </bean> <bean id="jvmConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="vm://localhost"/> <property name="copyMessageOnSend" value="false"/> </bean> <!-- Audit Factory --> <bean id="auditFactory" class="com.straycatstudios.wsc.server.framework.audit.JmsAuditFactory" depends-on="jvmBroker"> <constructor-arg index="0"> <bean class="com.straycatstudios.wsc.common.spring.messaging.JmsSender"> <constructor-arg> <bean class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jvmConnectionFactory"/> <property name="defaultDestinationName" value="${jms.queue.audit}"/> <property name="messageConverter"> <bean class="com.straycatstudios.wsc.server.framework.audit.EventMessageConverter"> <constructor-arg index="0" ref="simpleMessageConverter"/> </bean> </property> </bean> </constructor-arg> </bean> </constructor-arg> </bean> So it looks like it is using standard beans to set up the BrokerService and other ActiveMQ stuff, instead of using the new style of embedding ActiveMQ XML configuration inside the Spring XML. The JmsAuditFactory is the class that does the sending, taking a JmsSender as constructor argument. So finally, my question is: How I would go about setting up this composite destination with a minimal amount of modifications to the Spring XML configuration? The The example at [1] only shows how to do it with the new approach of Spring configuration, but I'd rather not do invasive things such as converting the whole thing to the new embedded style, as I'm afraid I'd screw things up. Very grateful for any tips/pointers on how to proceed. The full Spring configuration of the game server is at http://paste.kde.org/789248/raw/ , in case the above paste is not enough (or mangled). Best regards, Elvis Stansvik [1] http://activemq.apache.org/virtual-destinations.html#VirtualDestinations-CompositeDestinations