Transaction事务

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();

    }
}


posted @ 2020-08-11 13:30  柒丶月  阅读(72)  评论(0编辑  收藏  举报