【RabbitMQ、Spring Boot】Spring Boot整合RabbitMQ事务消息机制

一、Spring Boot整合RabbitMQ事务消息机制

注释application.yml中配置的消息确认机制,因为使用事务消息机制,不能同时使用消息确认机制

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 7006
    username: admin
    password: admin
    # 是否触发回调方法
    # NONE值是禁用发布确认模式,是默认值
    # CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例
    # SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
#    publisher-confirm-type: correlated

注册RabbitMQ事务管理器

package com.cyun.demo.rabbitmq.provider.config;

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类
 *
 * @author He PanFu
 * @date 2022-04-18 19:16:52
 */
@Configuration
public class RabbitmqConfig {

    /**
     * 注册rabbitmq事务管理器
     *
     * @param connectionFactory 连接工厂
     * @param rabbitTemplate    rabbit模板
     * @return rabbitmq事务管理器
     */
    @Bean
    public RabbitTransactionManager rabbitTransactionManager(CachingConnectionFactory connectionFactory, RabbitTemplate rabbitTemplate) {
        // channel开启事务支持
        rabbitTemplate.setChannelTransacted(true);

        return new RabbitTransactionManager(connectionFactory);
    }
}

发送者发送消息:需使用@Transactional(rollbackFor = Exception.class)事务注解

    @GetMapping("/direct/wx/transactional")
    @Transactional(rollbackFor = Exception.class)
    public String sendDirectMessageTransactional() {
        rabbitTemplate.convertAndSend("direct_exchange", "wx", getStringObjectMap());

        log.info("开启事务消息机制");
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "ok";
    }

结果展示:消费者收到消息和发送者发出消息间隔了5s
在这里插入图片描述
参考链接:
Spring Boot整合RabbitMQ——生产者发送确认

你可能感兴趣的:(RabbitMQ,spring,boot,分布式,微服务,rabbitmq)