ActiveMQ中消息的事务和消息的确认机制

消息的事务

消息生产者的事务

在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方法的第二个参数进行设置。

参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值