15.SpringBoot整合生产者

SpringBoot整合RabbitMQ生产者

1.生产者整合RabbitMQ的基本配置

1.1:引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

1.2:配置文件

spring:
  rabbitmq:
    host: 192.168.1.199
    port: 5672
    username: root
    password: 123456
    virtual-host: /
    # 发送方确认类型为异步确认
    publisher-confirm-type: correlated
    # 是否启用发布者返回。
    publisher-returns: true
    template:
      # 是否开启失败通知
      mandatory: true
      # 重试
      retry:
        enabled: false
        # 第一次重试的时间间隔
        initial-interval: 1000
        # 最大重试次数
        max-attempts: 3
        # 最大重试时间间隔
        max-interval: 10000
        # 乘子  重试间隔*乘子得出下次重试间隔
        multiplier: 1
    # 超时时间
    connection-timeout: 1000

1.3:配置类(两个)

/**
 * @author 单国玉
 * @date 2021/04/07
 * @description 这个配置类负责创建交换机, 队列, 绑定等资源
 */
@Configuration
public class RabbitConfig {

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("shanguoyu", false, false, null);
    }

    @Bean
    public DirectExchange sixinExchange() {
        return new DirectExchange("shanguoyu-sixin", false, false, null);
    }

    @Bean
    public Queue sixinQueue() {
        return new Queue("shanguoyu-queue", false, false, false);
    }

    @Bean
    public Binding binding(Queue sixinQueue, DirectExchange sixinExchange) {
        Binding binding = BindingBuilder.bind(sixinQueue).to(sixinExchange).with("shanguoyu");
        return binding;
    }

    @Bean
    public Queue directQueue() {
        HashMap<String, Object> stringHashMap = new HashMap<>();
        stringHashMap.put("x-dead-letter-exchange", "shanguoyu-sixin");
        stringHashMap.put("x-dead-letter-routing-key", "shanguoyu");
        return new Queue("shanguoyu", false, false, false, stringHashMap);
    }

    /**
     * 延时队列
     *
     * @param directQueue
     * @param directExchange
     * @return
     */
//    @Bean
//    public CustomExchange delayExchange() {
//        Map<String, Object> args = new HashMap<>();
//        args.put("x-delayed-type", "direct");
    //参数:交换机名字,交换机类型为x-delayed-message由延时队列拆件提供,是否持久化,是否自动删除,扩展参数
//        return new CustomExchange("delayExchange", "x-delayed-message", false, false, args);
//    }
    @Bean
    public Binding directBinding(Queue directQueue, DirectExchange directExchange) {
        Binding binding = BindingBuilder.bind(directQueue).to(directExchange).with("shanguoyu");
        return binding;
    }

}
-------------------------------------------------------------

/**
 * @author 单国玉
 * @date 2021/4/7
 * @description 定制RabbitTemplate
 */
@Configuration
public class RabbitTemplateConfig {
    RabbitTemplate rabbitTemplate;

    @Primary
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        this.rabbitTemplate = rabbitTemplate;
        initRabbitTemplale();
        return rabbitTemplate;
    }

    private void initRabbitTemplale() {
        /**
         * @param correlationData 当前消息的唯一关联数据(这个是消息的唯一id)
         * @param ack 消息是否成功收到
         * @param cause 失败的原因
         */
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            if (ack) {
                System.out.println("已发送到交换器!");
            } else {
                //处理失败的消息
                System.out.println("出现了异常!(考虑重发)");
                System.out.println("原因是:" + cause);
            }
        });
        /**
         * 设置消息未抵达队列回调,只要消息没有投递给指定队列,就触发这个失败回调
         * @param message 投递失败的消息详细信息
         * @param replyCode 回复的状态码
         * @param replyText 回复的文本内容
         * @param exchange  当时这个消息发送给哪个交换机
         * @param routingKey  当时这个消息用的哪个路由键
         */
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            System.out.println("失败通知:消息不可路由!");
            System.out.println("消息是:" + new String(message.getBody()));
            System.out.println("交换器是::" + exchange);
            System.out.println("路由键是:" + routingKey);
            System.out.println("状态码:" + replyCode);
            System.out.println("错误原因:" + replyText);
        });
    }
}

2.发送消息

2.1:send方法

@Resource
private RabbitTemplate rabbitTemplate;

public void sendMsg(String msg){
    //构建correlationData 可用于做可靠性投递得,ID:必须为全局唯一的 根据业务规则
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
    //构建Message对象
    Message message = new Message("shanguoyu".getBytes(), MessagePropertiesBuilder.newInstance().build());
    //                   交换机       路由键     消息    correlationData
    rabbitTemplate.send("shanguoyu", "shanguoyu",message,correlationData);
}

2.2:convertAndSend方法

@Resource
private RabbitTemplate rabbitTemplate;

public void sendMsg(String msg){
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        //                              交换机      路由键     消息(Object类型) 后置处理器  correlationData
        rabbitTemplate.convertAndSend("shanguoyu","shanguoyu","msg".getBytes(),msg->{
            //在发送消息之前应用于消息的处理器
            return msg;
        },correlationData);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值