Java 如何在Activemq中回滚消息

Java 如何在Activemq中回滚消息,java,jms,activemq,Java,Jms,Activemq,当变量x值等于1时,我想向Activemq发送确认。如果它不等于1,我想将消息重新传递到Activemq。然后,只有Activemq将该消息再次发送给订阅者 MessageConsumer.java: public class Consumer extends HttpServlet { @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws Servlet

当变量
x
值等于
1
时,我想向
Activemq
发送确认。如果它不等于
1
,我想将消息重新传递到
Activemq
。然后,只有
Activemq
将该消息再次发送给订阅者

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();
}
 }
这是做这件事的正确方法吗?你能给我提个建议吗?有什么有效的方法吗


谢谢。

理想情况下,您必须:

创建一个到绑定地址的ActiveMQConnectionFactory, 创建一个重新交付策略,并将其设置为ActiveMQConnectionFactory。 创建一个会话,如果为true,则使用会话.commit(),如果失败,则使用会话.rollback()

这两个链接可能会帮助您:


}

我读了你的建议。他们正在解释个别邮件的重新投递尝试超过
最大重新投递次数时的情况。该特定邮件发送到
DLQ
。为什么这个概念对我有用。我使用的是
主题非队列和非事务会话。我可以为此使用
事务处理会话
。我用我的代码更新了我的问题。你能用一些代码解释一下吗。我写了两个程序。一个是给消费者的,另一个是
MessageListener
。根据我的理解,如果我们想使用
rollback()
我们需要
session
对象,但它在consumer程序中。我如何访问
MyListener
。尝试将您的侦听器创建为匿名内部类,使session对象成为最终对象,那么session对象将在Consumery中可用,您的意思是,我是否需要在消费者程序中编写
MYListener
。我根据您的代码进行了修改。此外,我正在使用
主题
事务处理
。确认模式是:
会话。自动确认
。你能检查一下吗?我想应该可以。。尝试后一定要回复。此链接可能会帮助您:
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) {
....
}
};
....
}