ActiveMQ 是支持事务的 /** * 通过Connection对象创建Session会话,用于接收消息。 * 参数1:是否启用事务 * 参数2:签收模式,默认设置为自动签收 */ Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);是否添加事务的区别
MQ的签收方式【三种签收方式】 [ Session.AUTO_ACKNOWLEDGE ] 当客户端从receiver或onMessage成功返回时,Session自动签收客户端的这条消息的收条。 [ Session.CLIENT_ACKNOWLEDGE ] 客户端通过调用消息(Message)的acknowledge方法签收消息。 在这种情况下,签收发生在Session层面: 签收一个已经消费的消息会自动地签收这个Session所有已消费的收条。 [ Session.DUPS_OK_ACKNOWLEDGE ] Session不必确保对传送消息的签收,这个模式可能会引起消息的重复,但是降低了Session的开销,所以只有客户端能容忍重复的消息,才可使用。 [Session.CLIENT_ACKNOWLEDGE 签收方式】 一般来说 要求消息能够准确送达的 都用第二种手动签收方式对消息送达率要求不是十分精确的都用第一种默认的自动签收 ***注意手动签收需要调用 msg.acknowledge();方法 告诉mq的服务器 消息已经签收这个消息才会被消费掉 while(true){ TextMessage msg =(TextMessage)messageConsumer.receive(); //消费者手工去签收消息,另起一个线程(TCP)去通知MQ服务确认消息签收 msg.acknowledge(); if(msg==null) break; System.out.println("【消费者接收】"+msg.getText()); } ***在手动签收的情况下 如果生产者生产消息开启了事务那个在消费者消费消息的时候就不用开启事务 消费者的session与生产者的session签收模式保持一致, 注意,生产者启用事务了,但是消费者这里事务不要启用,不然会一直消费例如: //生产者session //开启事务 //手动签收 Session session= connection.createSession(Boolean.TRUE,Session.CLIENT_ACKNOWLEDGE); //消费者session //关闭事务 //手动签收Session session =connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
作者:传智播客JavaEE培训学院 首发:http://java.itcast.cn
|