消息应答机制重复发送JMS(八)

1,需要在spring.xml下增加重复发送配置:

<beanid="activeMQRedeliveryPolicy"class="org.apache.activemq.RedeliveryPolicy"> 

       <!--是否在每次尝试重新发送失败后,增长这个等待时间--> 

            <propertyname="useExponentialBackOff"value="true"></property> 

       <!--重发次数,默认为6   这里设置为1 --> 

        <propertyname="maximumRedeliveries"value="2"></property> 

       <!--重发时间间隔,默认为1 --> 

        <propertyname="initialRedeliveryDelay"value="30000"></property> 

       <!--第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value --> 

        <propertyname="backOffMultiplier"value="2"></property> 

       <!--最大传送延迟,只在useExponentialBackOfftrue时有效(V5.5),假设首次重连间隔为10ms,倍数为2,那么第  

            二次重连时间间隔为20ms,第三次重连时间间隔为40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。 --> 

        <propertyname="maximumRedeliveryDelay"value="1000"></property> 

    </bean> 

2,在连接工厂加入配置:

<beanid="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">

<!-- TCP异步传输 -->

<propertyname="brokerURL"value="tcp://localhost:61616?jms.useAsyncSend=true" />

 <propertyname="redeliveryPolicy" ref="activeMQRedeliveryPolicy"/>

</bean>

3,需要注意的是需要在发送消息的时候将,session设置为:

 jsmTemplate.send(destination, newMessageCreator() {

                   @Override

                   publicMessage createMessage(Session session) throws JMSException {

                           session =jsmTemplate.getConnectionFactory().createConnection().createSession(true,Session.CLIENT_ACKNOWLEDGE);

                       Messagemsg =session.createTextMessage(Cachkey);

                       //设置发送的信息类型 为持久化信息

                       msg.setJMSDeliveryMode(DeliveryMode.PERSISTENT);

                       return msg;

                   }

           });

关于这个session参数的说明可以参照:http://blog.csdn.net/ntc10095/article/details/51073302

 

4,如果你开始是用的一个消费者方法来接受消息,那么这个消费者方法是一个同步的,如果你采用的是一个监听来

接受消息的,则这个监听则是异步的,你应该实现SessionAwareMessageListener接口而不是MessageListener接口,

因为前者带返回的session,这里如果重新发送消息,需要session调用recover()方法。

值得注意的是:

 如果你设置的重发数比较小,消息发完了,就算消息是持久的,下次重启服务,消息也不发送了,

所以如果你想让消息没有成功的执行,再次发送消息,就应该将重发数设置的足够大。

(应用列如:用来监听一个线程是否正确的结束)

 

publicclass ConsumerMessageListener implementsSessionAwareMessageListener<TextMessage> {

@Override

publicvoid onMessage(TextMessage message, Session session) throws JMSException {

TextMessagetext=(TextMessage) message;

Stringresult=text.getText();

System.out.println("ConsumerMessageListerner服务器接收到的回复信息:"+ result);

session.recover();

}

}

 

最好也在绑定发送和监听的容器中加入session消息单条确认:

<beanid="jmsContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer">

<propertyname="connectionFactory" ref="singleConnectionFactory"/>

<propertyname="destination" ref="sendQueueDestination" />

<propertyname="messageListener" ref="consumerMessageListener" />

<property name="sessionAcknowledgeMode"value="4"/>

</bean>

 

定于在session对象中:

AUTO_ACKNOWLEDGE= 1 :自动确认

CLIENT_ACKNOWLEDGE= 2:客户端手动确认 

DUPS_OK_ACKNOWLEDGE= 3: 自动批量确认

SESSION_TRANSACTED= 0:事务提交并确认

但是在activemq补充了一个自定义的ACK模式:

INDIVIDUAL_ACKNOWLEDGE= 4:单条消息确认

 

来自 <https://segmentfault.com/a/1190000008707181

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值