消息的事务
消息生产者的事务
在activeMQ中,Connection类的createSession方法有两个参数,一个是消息确认机制(自动确认还是手动确认),另一个是事务消息,当我们把这个事务消息设置为true的时候,activeMQ不会主动提交事务,需要我们在最后使用session.commit()方法去提交事务,这样才能在activeMQ的控制台看到消息。运行下面的代码,如果去掉session.commmit(),是看不到消息的。总之,开启事务消息以后必须要使用session.commit()方法提交消息。
public class JmsProduceTx {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
//创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//创建连接
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话,第一个参数是是否开启事务,第二个参数是签收
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建目的地(队列还是主题)
Queue queue = session.createQueue(QUEUE_NAME);
//创建消息生产者
MessageProducer messageProducer = session.createProducer(queue);
for (int i = 0; i < 3; i++) {
TextMessage textMessage = session.createTextMessage("--msg--" + i);
messageProducer.send(textMessage);
}
session.commit();
//关闭资源
messageProducer.close();
session.close();
connection.close();
System.out.println("消息成功发送");
}
}
没有添加session.commit()运行以后的结果。
添加session.commit()以后运行的结果。
消息消费者的事务
public class JmsConsumerTx {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工场,按照给定的Url地址,采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//2.通过连接工场,获得连接connection并启动访问
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话session
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建目的地
Queue queue = session.createQueue(QUEUE_NAME);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(queue);
while (true) {
//循环等待接收消息,消费消息
TextMessage textMessage = (TextMessage) messageConsumer.receive(4000L);
if (null != textMessage) {
System.out.println("***消费者接受到消息***:" + textMessage.getText());
} else {
break;
}
}
session.commit();
messageConsumer.close();
session.close();
connection.close();
}
}
没有添加session.commit()运行以后的结果。
添加session.commit()以后运行的结果。
消息的确认机制
消息确认的方式有3种。我们所介绍的消息接收确认机制,一律以接收者为准,与发送者没有关系。
方法 | 代表的意义 |
---|---|
Session.AUTO_ACKNOWLEDGE | 消费者成功从receive方法返回时,或者从MessageListener.onMessage方法成功返回时,会话自动确认消息 |
Session.CLIENT_ACKNOWLEDGE | 客户端显示调用acknowledge方法确认消息 |
Session.DUPS_OK_ACKNOWLEDGE | 不是必须确认,是一种“懒散的”消息确认,消息可能会重复发送,在第二次重新传送消息时,消息头的JMSRedelivered会被置为true标识当前消息已经传送过一次,客户端需要进行消息的重复处理控制 |
Session.SESSION_TRANSACTED | 事务提交并确认。 配合事务消息的 |
至于代码就不给出了,消息的确认机制在createSession方法的第二个参数进行设置。