activemq深入了解—队列模式手动控制消费

        相信经过了解,基本使用activemq后,大家一定知道队列里面有ACK模式,他的类型有以下几种

        1、AUTO_ACKNOWLEDGE = 1    自动确认

        2、CLIENT_ACKNOWLEDGE = 2    客户端手动确认

3、DUPS_OK_ACKNOWLEDGE = 3    自动批量确认

4、SESSION_TRANSACTED = 0    事务提交并确认

5、INDIVIDUAL_ACKNOWLEDGE = 4    单条消息确认(自定义ACK_MODE)


使用方式一般有

1、使用连接创建session

               Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);   

2、spring中配置

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
       
             <property name="connectionFactory" ref="connectionFactory"></property>
       
             <property name="defaultDestination" ref="destination"></property>
       
             <property name="messageConverter" ref="jmsMessageConverter"></property>
       
             <property name="sessionAcknowledgeMode" value="2" />
   
           </bean>

 注意:当我们只配置了这些,以为在消费者出获取消息调用message.acknowledge();方法就能控制消息的消费,很明显,不行!

       查阅资料你会发现,当你获取消息的时候,默认的获取方法里面没有走你的这些配置直接就消费了消息,所以就达不到我们想要的效果,手动控制消费。所以,我们需要重写一个方法手动获取,但是带上自己的参数。

  1. /**  
  2.      * 接收消息   
  3.      * @param session   
  4.      * @param consumer   
  5.      * @param autoAcknowledge 是否开启手动消费  
  6.      * @return   
  7.      * @throws JMSException   
  8.      */  
  9.     protected Message doReceive(Session session, MessageConsumer consumer,Boolean autoAcknowledge) throws JMSException {    
  10.         try {    
  11.             this.consumer = consumer;    
  12.             //Use transaction timeout (if available).    
  13.             long timeout = 1000;  
  14.             Message message = doReceive(consumer, timeout);    
  15.             if (session.getTransacted()) {    
  16.                 // Commit necessary - but avoid commit call within a JTA transaction.    
  17.                 // 如果开启了jta事物,那么不会进行提交,jta事物会直接覆盖掉session事物    
  18.                 if (isSessionLocallyTransacted(session)) {    
  19.                     // Transacted session created by this template -> commit.    
  20.                     //创建事物回话  
  21.                     JmsUtils.commitIfNecessary(session);    
  22.                 }    
  23.             }    
  24.             //autoAcknowledge如果为真,不进行自动确认    
  25.             else if (isClientAcknowledge(session) && !autoAcknowledge) {    
  26.                 // Manually acknowledge message, if any.    
  27.                 if (message != null) {    
  28.                     message.acknowledge();    
  29.                 }    
  30.             }    
  31.             return message;    
  32.         }    
  33.         finally {    
  34.             consumer = null;    
  35.         }    
  36.     }  

  1. /**   
  2.      * 由于上面的doReceive(Session session, MessageConsumer consumer,Boolean autoAcknowledge)需要调用这个方法,   
  3.      * 而在父类里面这个方法是私有的,所以直接拷贝下来了   
  4.      * @param consumer   
  5.      * @param timeout   
  6.      * @return   
  7.      * @throws JMSException   
  8.      */  
  9.     private Message doReceive(MessageConsumer consumer, long timeout) throws JMSException {    
  10.         if (timeout == RECEIVE_TIMEOUT_NO_WAIT) {    
  11.             return consumer.receiveNoWait();    
  12.         }    
  13.         else if (timeout > 0) {    
  14.             return consumer.receive(timeout);    
  15.         }    
  16.         else {    
  17.             return consumer.receive();    
  18.         }    
  19.     }    
在获取内容之前先判断SessionAcknowledgeMode的值,根据是否需要手动控制传入autoAcknowledge,达到手动控制的效果。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值