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) {
....
}
};
....
}