事务签收
事务
生产者提交事务时设置:
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();
}
}
评论区