1、queue默认是持久化的;topic,因为要发送给多个人,默认是非持久化的,就是说topic里的消息放在内存里,只发给在线的订阅者,如果想要收到topic里所有的消息怎么办呢?这时,又有一个新的概念了,持久订阅。
(1)、消息的生产者增加<property name="deliveryMode" value="2" />的配置。
<!-- 定义JmsTemplate的Topic类型 --> <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> <constructor-arg ref="cachingConnectionFactory" /> <!-- pub/sub模型(发布/订阅) --> <property name="pubSubDomain" value="true" /> <!-- 进行持久化 --> <property name="deliveryMode" value="2" /> </bean>
(2)、消息的消费者增加
<!-- 1、单独的接收topic消息的cachingConnectionFactory,不要和发送的或接收queue消息的一样 --> <bean id="cachingConnectionFactory1" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="connectionFactory"></property> <property name="sessionCacheSize" value="100" /> <!-- 2、接收者ID --> <property name="clientId" value="${activemq.queue.name}" /> </bean> <bean id="topicCustomerA" class="org.apache.activemq.command.ActiveMQTopic"> <!-- 订阅消息的名字 --> <constructor-arg index="0" value="${activemq.gwcs.topic.name}"/> </bean> <bean id="receiveTopicGwcsListener" class="com.zzstxx.unify.message.listener.ReceiveTopicGwcsListener" /> <bean id="listenerContainerA" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="cachingConnectionFactory1" /> <property name="destination" ref="topicCustomerA" /> <property name="messageListener" ref="receiveTopicGwcsListener" /> <!-- 3、持久化消息 --> <property name="subscriptionDurable" value="true"/> <!-- 4、接收者ID --> <property name="clientId" value="${activemq.queue.name}" /> <property name="durableSubscriptionName" value="${activemq.queue.name}"/> </bean>