首页 > 其他 > 详细

Transaction事务

时间:2020-08-11 14:39:03      阅读:92      评论:0      收藏:0      [点我收藏+]

producer提交时的事务

  1. false
    • 只要执行send,就进入到队列中
    • 关闭事务,那第2个签收参数的设置需要有效
  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();

    }
}

技术分享图片
技术分享图片

Transaction事务

原文:https://www.cnblogs.com/qiuwenli/p/13475046.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!