Transaction事务
producer提交时的事务
- false
- 只要执行send,就进入到队列中
- 关闭事务,那第2个签收参数的设置需要有效
- true
- 先执行send再执行commit,消息才被真正提交到队列中
- 消息需要批量提价,需要缓冲处理
事务偏生产者/签收偏消费者
生产者
public class Jms_TX_Producer {
public static final String ACTIVEMQ_URL = "tcp://112.124.20.231:61616";
public static final String QUEUE_NAME = "topic01";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(QUEUE_NAME);
MessageProducer producer = session.createProducer(queue);
try {
for (int i = 1; i < 4; i++) {
TextMessage textMessage = session.createTextMessage("tx msg--" + i);
producer.send(textMessage);
}
session.commit();
System.out.println("消息发送完成");
} catch (Exception e) {
System.out.println("出现异常,消息回滚");
session.rollback();
}finally {
producer.close();
session.close();
connection.close();
}
}
}
消费者
public class Jms_TX_Consumer {
public static final String ACTIVEMQ_URL = "tcp://112.124.20.231:61616";
public static final String QUEUE_NAME = "topic01";
public static void main(String[] args) throws Exception{
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//消费者设置了手动签收,就必须自己签收,向服务器发送我已经收到消息了
// 开启事务如果不提交,就算手动签收,也是无效的
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 (textMessage != null) {
System.out.println("消费者收到消息:"+textMessage.getText());
}else {
break;
}
}
messageConsumer.close();
session.commit(); //不手动提交就会产生消息重复消费
session.close();
connection.close();
}
}