ActiveMQ的Topic持久化

转:http://blog.csdn.net/wangdongsong1229/article/details/8219536?utm_source=tuicool&utm_medium=referral

二、配置

1、消息发送方

在消息发送时,需要为消息发送方配置一个clientIDPrefix的一个属性,该属性来表示那个消费者可以获得此消息,配置文件如下:

  1. <!-- 配置connectionFactory -->  
  2.     <bean id="jmsSenderFactory" class="org.apache.activemq.pool.PooledConnectionFactory"  
  3.         destroy-method="stop">  
  4.         <property name="connectionFactory">  
  5.             <bean class="org.apache.activemq.ActiveMQConnectionFactory">  
  6.                 <property name="brokerURL" value="${jms.sendBrokerURL}">  
  7.                 </property>  
  8.                 <property name="useAsyncSend" value="true"></property>  
  9.                 <!-- clinetIDPrefix属性 -->  
  10.                 <property name="clientIDPrefix" value="${jms.senderClientIDPrefix)"></property>  
  11.             </bean>  
  12.         </property>  
  13.         <property name="maxConnections" value="100"></property>  
  14.     </bean>  

clientIDPrefix:指定了consumer的clientID的前缀,符合此前缀规则的consumer将成为该TOPIC的持久订阅者。

2、消息接收者

  1. <!--异步调用消息 -->  
  2.     <bean id="receive"  
  3.         class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  4.         <property name="connectionFactory" ref="jmsReceiverFactory"></property>  
  5.         <property name="destinationName" value="${jms.receiveDestinationName}"></property>  
  6.         <property name="messageListener" ref="messageListener"></property>  
  7.         <property name="sessionAcknowledgeMode" value="1"></property>  
  8.         <property name="subscriptionDurable" value="true"></property>  
  9.         <property name="pubSubDomain" value="true"></property>  
  10.         <property name="clientId" value="${jms.receiverClientId}"></property>  
  11.         <property name="durableSubscriptionName" value="${jms.receiverClientId}"></property>  
  12.           
  13.     </bean>  

Durable Subscription:

对于通常的消息订阅来说, JMS Provider会对这类消息订阅者“一视同仁”,你来了,我就给你消息,你走了,我就不管你了。 当消息到达指定Topic之后,JMS Provider只会为已经连接并且订阅了该指定Topic的消息订阅者发送消息, 如果消息到达之后你恰好不在,那不好意思,你将接收不到这一消息。这就好像现在的商场促销活动,礼品(消息)有限,虽然你(相当于消息订阅者)也想获得相应的礼品, 但当发送礼品的时候你不在礼品派发现场的话,你将失去这一获得礼品(消息)的机会,因为商场可不会管你是何方神圣,对于JMS Provider来说, 也是同样道理,只要我(JMS Provider)派发消息的时候你不在,你收不到消息是你自己找的,跟我没有关系。 也就是说,JMS Provider不会“耗费脑筋”去记下谁还没有来接收消息,就跟商场不会纪录到底谁的礼品还没有来领取一样, 因为对于这种情况来说,耗费资源去这些不确定的client, 完全就是non-sense的,不是嘛? JMS Provider或者说商场,根本就不会知道谁会来领取消息或者礼品。

当我们转到Durable Subscription的时候,情况就完全不同了。如果消息订阅者通过Durable Subscription的方式来订阅消息, 那么JMS Provider将会费点儿脑筋来记下这个Durable Subscription的消息订阅者是谁,即使当消息到达之后,该Durable Subscription消息订阅者不在, JMS Provider也会保证, 该Durable Subscription消息订阅者重新回来之后,之前到达而该Durable Subscription消息订阅者还没有处理的消息,将被一个不少的发送给它。

clientId:是在连接时必须提供的,做为subscriptionDurable为ture,必须提供该属性,这个clientId会与JMS Provider的clientPrefixID匹配,才能接到相应的消息

单凭Client Id还不足以唯一标志某一个Durable Subscription,就跟我凭一个身份证,可以预定多个房间一样。 同一个连接里,你可以创建多个MessageConsumer去订阅不同Topic的消息,如果下回回来,你只想继续接受某一个Topic消息的话,JMS Provider如何知道是哪一个? 所以,为了区分同一个Connection中不同的Durable Subscription,我们还需要进一步的标志物,这就是Subscriber Name!

 

这就是关于subscriptionDurable、clientId、durableSbscriptionName的解释,具体可参阅http://shshy39.iteye.com/blog/487008

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值