如何在Activemq中回滚消息 [英] How to rollback messages in Activemq

查看:300
本文介绍了如何在Activemq中回滚消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当变量 x 值等于 1时,我想向 Activemq 发送确认。如果它不等于 1 ,我想将消息重新发送到 Activemq 。然后只有 Activemq 再次向订阅者传递消息。为此,我编写了以下程序。

I want to send acknowledgement to Activemq when variable x value is equals to 1.If it not equals to 1,I want to redeliver messages to Activemq. Then only Activemq delivers that messages again to subscribers.For this I written the following programs.

MessageConsumer.java:

MessageConsumer.java :

 public class Consumer extends HttpServlet {
 @Override
 protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
    throws ServletException, IOException {
  try {
    ActiveMQConnectionFactory connectionFactory=new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617");
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setInitialRedeliveryDelay(1000L);
policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES);
connectionFactory.setRedeliveryPolicy(policy);
connectionFactory.setUseRetroactiveConsumer(true);
Connection connection=connectionFactory.createConnection();
final Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
Topic queue=session.createTopic("MessageTesting");
javax.jms.MessageConsumer consumer=session.createConsumer(queue);
//anonymous class
MessageListener listener = new MessageListener() {
        @Override
    public void onMessage(Message msg) {
        TextMessage msg1=(TextMessage)msg;
        try {
                String messageBody=msg1.getText();
                if (x==1) {
                   //Process was completely done,so I am sending acknowledge
                   session.commit();
                }  
                else {
                   //Process is not done sucessfully, So I want to redeliver messages, For this
                   session.rollback();
                 }
           }
          catch (Exception e) {
                 e.printStackTrace();
           }

    }
};
consumer.setMessageListener(listener);
connection.start();
}
 }

这是正确的做法。你建议我有没有办法。

Is this correct way to do this.can you suggest me,Is there any efficient way.

谢谢。

推荐答案

理想情况下,您必须:

为您的绑定地址创建 ActiveMQConnectionFactory
创建 RedeliveryPolicy 并将其设置为 ActiveMQConnectionFactory
创建会话并使用 session.commit()(如果为true)和 session.rollback()(如果失败)。

Create a ActiveMQConnectionFactory to your binding address, Create a RedeliveryPolicy and set it to ActiveMQConnectionFactory. Create a Session and use session.commit() if true and session.rollback() if it failed.

这两个链接可能对您有所帮助:

These two links might help you:

http://activemq.apache.org/message-redelivery-and-dlq-handling.html

http://activemq.apache.org/redelivery-policy.html

public class Consumer extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
try {
...
MessageListener listener = new MessageListener() {
public void onMessage(Message msg) {
....
}
};
....
}

}

这篇关于如何在Activemq中回滚消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆