创建连接工厂,其中broker url到JVM
<!--tcp://localhost:61616-->
<bean id="connectionFactoryActiveMQ" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost"/>
<property name="useAsyncSend" value="true"/>
</bean>
创建单连接工厂,因为需要一个连接
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactoryActiveMQ"/>
</bean>
创建主题目的地,因为需要实现一些类
<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
<property name="physicalName" value="TEST"/>
</bean>
生成jmsTemplate对象
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestination" ref="destination"/>
<property name="pubSubDomain" value="true"/>
</bean>
My classes who receive messages
<bean id="messageListener1" class="com.aimrposoft.jms.server.Server"/>
<bean id="messageListener2" class="com.aimrposoft.jms.server.Server1"/>
<bean id="messageListener3" class="com.aimrposoft.jms.server.Server2"/>
Generate message class
<bean id="producer" class="com.aimrposoft.jms.client.Producer"/>
<!--<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">-->
<!--<property name="connectionFactory" ref="connectionFactory"/>-->
<!--<property name="destination" ref="destination"/>-->
<!--<property name="messageListener" ref="messageListener1"/>-->
<!--</bean>-->
<jms:listener-container
connection-factory="connectionFactory" destination-type="topic" acknowledge="transacted">
<jms:listener destination="TEST" ref="messageListener1" method="onMessage" subscription="subscription"/>
<jms:listener destination="TEST" ref="messageListener2" method="onMessage" subscription="subscription"/>
<jms:listener destination="TEST" ref="messageListener3" method="onMessage" subscription="subscription"/>
</jms:listener-container>
当我使用vm://localhost时,消息侦听器无法正常工作,但如果我运行activeMQ并将代理URL更改为tcp://localhost:61616,所有工作都很好。
我认为您缺少启动嵌入式代理的配置,您可以尝试将其添加到您的配置中吗:
<amq:broker id="activeMQBroker">
<amq:transportConnectors>
<amq:transportConnector uri="vm://localhost" />
</amq:transportConnectors>
</amq:broker>
amq命名空间前缀可以这样定义:
xmlns:amq="http://activemq.apache.org/schema/core"
为了进一步了解Biju的答案,我使用了队列而不是主题,这是我的春季配置,它似乎运行得很好(62999只是一个随机可用的端口号):
<amq:broker useJmx="false" persistent="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:62999" />
</amq:transportConnectors>
</amq:broker>
<bean id="rawConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localEmbeddedBroker" />
</bean>
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="rawConnectionFactory" />
<property name="sessionCacheSize" value="30" />
<property name="cacheProducers" value="true" />
<property name="cacheConsumers" value="false" />
</bean>