With some help from dejanb on IRC I figured it out. It was a simple matter of passing "${jms.queue.audit},my_new_queue" as defaultDestinationName of the JmsTemplate, so much easier than I thought :)
Best regards, Elvis Stansvik 2013/7/4 Elvis Stansvik <elvst...@gmail.com> > 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 >