侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

ActiveMQ事务及其它

coydone
2022-06-13 / 0 评论 / 0 点赞 / 304 阅读 / 1,785 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

事务签收

事务

生产者提交事务时设置:

Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//当启用事务时,必须要提交事务才能进入到MQ的队列里
session.commit();

1、false:只要执行send就进入到队列中,没有事务,那么第二个参数签收就有效。

2、true:先执行send再执行commit,消息才被真正的提交到队列中。使用场景:当消息需要批量发送,要确保所要消息全部发送成功才会全部入队。

消费者消费事务的设置:

1、false:消费者接收到消息之后直接消费完成,队列中不再有未消费的消息。

2、true:消息者接收到消息之后消费完成。队列中的消费没有被标记为消费,再次启动消费者还可以接收到消息。

签收(Acknowledge)

1、非事务模式下签收:

生产者签收设置为自动,消费者签收设置为自动,正常。生产者 签收设置为自动,消费者签收设置为手动,会出重复消费,使用手动签收可以解决。

message.acknowledge();//签收

生产者签收设置为手动,消费者 签收设置为自动,正常。

2、有事务模式下签收

  • 生产者 签收设置为自动,消费者 签收设置为自动,已提交,正常。

  • 生产者 签收设置为自动,消费者 签收设置为自动,未提交,会出现重复消费。

  • 生产者 签收设置为自动,消费者 签收设置为手动,未提交,已ACK 会出重复消费。

  • 生产者 签收设置为自动,消费者 签收设置为手动,已提交,未ACK正常。

  • 生产者 签收设置为手动,消费者 签收设置为自动,已提交,正常。

  • 生产者 签收设置为手动,消费者 签收设置为自动,未提交,会出现重复消费。

  • 生产者 签收设置为手动,消费者 签收设置为自动,未提交,未ACK,会出重复消费。

  • 生产者 签收设置为手动,消费者 签收设置为自动,未提交,已ACK,会出重复消费。

  • 生产者 签收设置为手动,消费者 签收设置为手动,已提交,未ACK,正常。

  • 生产者 签收设置为手动,消费者 签收设置为手动,已提交,已ACK,正常。

ActiveMQ事务签收总结

事务偏生产者,签收偏消费者,消费者那边不用开户事务,否则出现重复消费 。

事务偏向于消息生产方。如果生产方开启事务,发完消息之后未提交事务,那么消息不会进入队列。

签收偏向于消息的消费方。

  • 如果消费方未开启事务,设置签收模式为手动,那么必须ack。

  • 如果消费方开启事务,设置签收为自动,也要提交事务。

  • 如果消费方开启事务,设置签收为手动,可以不用ACK,但是必须提交事务。

ActiveMQ配置文件

ActiveMQ多配置文件启动:

conf/Jetty.xml:activemq的web模块的配置。

conf/activemq.xml:activemq的主配置文件。

#copy配置文件
cp activemq.xml activemq2.xml
#使用activemq2.xml启动
./bin/activemq start xbean:file:conf/activemq2.xml

内嵌的Broker

Broker:相当于一个ActiveMQ服务器实例。就是实现了用嵌入形式启动ActiveMQ把MQ嵌入到Java代码中,以便随时启动随时停止,在用的时候再去启动这样能节省资源,也保存证了可靠性。

使用:

1、pom文件引入jackson:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.1</version>
</dependency>

2、编写代码使用:

public class EmbedBroker {
    public static void main(String[] args) throws Exception {
        BrokerService brokerService = new BrokerService();
        brokerService.setUseJmx(true);
        brokerService.addConnector("tcp://localhost:61616");
        brokerService.start();
    }
}
0

评论区