rabbitmq消息队列

1:死信队列配置文件

package com.platform.config;

import com.platform.constant.MqConstant;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

import java.util.HashMap;
import java.util.Map;

import static com.platform.constant.MqConstant.UPDATEORDERSTATUSPAYEND;
import static com.platform.constant.MqConstant.UPDATEORDERSTATUSPAYENDDIE;
import static com.platform.constant.MqConstant.UPDATESTATUSPAYDIEMESSAGE;

/**
 * @author fengdongdong
 * @date 2019/5/18
 */
@Configuration
public class RabbitMqConfig {
    /**
     * 死信队列 交换机标识符
     */
    private static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
    /**
     * 死信队列交换机绑定键标识符
     */
    private static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";

    /**
     * 死信队列跟交换机类型没有关系 不一定为directExchange  不影响该类型交换机的特性.
     *
     * @return the exchange
     */
    @Bean("deadLetterExchange")
    public Exchange deadLetterExchange() {
        return ExchangeBuilder.directExchange("DL_EXCHANGE").durable(true).build();
    }

    /**
     * 声明一个死信队列.
     * x-dead-letter-exchange   对应  死信交换机
     * x-dead-letter-routing-key  对应 死信队列
     *
     * @return the queue
     */
    @Bean("deadLetterQueue")
    public Queue deadLetterQueue() {
        Map<String, Object> args = new HashMap<>(3);
//       x-dead-letter-exchange    声明  死信交换机
        args.put(DEAD_LETTER_QUEUE_KEY, "DL_EXCHANGE");
//       x-dead-letter-routing-key    声明 死信路由键
        args.put(DEAD_LETTER_ROUTING_KEY, "KEY_R");
        //过期时间
        args.put("x-message-ttl",2000);
        return QueueBuilder.durable(UPDATEORDERSTATUSPAYENDDIE).withArguments(args).build();
    }

    /**
     * 定义死信队列转发队列.
     *
     * @return the queue
     */
    @Bean("redirectQueue")
    public Queue redirectQueue() {
        return QueueBuilder.durable(UPDATESTATUSPAYDIEMESSAGE).build();
    }

    /**
     * 死信路由通过 DL_KEY 绑定键绑定到死信队列上.
     *
     * @return the binding
     */
    @Bean
    public Binding deadLetterBinding() {
        return new Binding(UPDATEORDERSTATUSPAYENDDIE, Binding.DestinationType.QUEUE, "DL_EXCHANGE", "DL_KEY", null);

    }

    /**
     * @return the binding
     */
    @Bean
    public Binding redirectBinding() {
        return new Binding(UPDATESTATUSPAYDIEMESSAGE, Binding.DestinationType.QUEUE, "DL_EXCHANGE", "KEY_R", null);
    }
}

2:消息发送

    /**
     * 功能描述 支付完成修改订单状态
     * @date 2019/5/17
     * @params [params]
     * @return boolean
     */

    @Override
    public boolean updateOrderStatusPayEnd(Map<String,Object> params) {
        try {
            String s1 = JSONObject.toJSONString(params);
            amqpTemplate.convertAndSend(MqConstant.UPDATEORDERSTATUSPAYEND, s1);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean updateOrderPayDieLetter(Map<String, Object> param) {
        try {
            String s1 = JSONObject.toJSONString(param);
            MessagePostProcessor messagePostProcessor = message -> {
                MessageProperties messageProperties = message.getMessageProperties();
//            设置编码
                messageProperties.setContentEncoding("utf-8");
//            设置过期时间10*1000毫秒(最终过期时间取x-message-ttl和messageProperties.setExpiration的最小值
                messageProperties.setExpiration("100000");
                return message;
            };
            amqpTemplate.convertAndSend("DL_EXCHANGE", "DL_KEY", s1, messagePostProcessor);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

3:配置文件

(1)生产者

spring:
  rabbitmq:
    host: 10.160.2.240
    port: 5672
    username: admin
    password: admin

(2)消费者

spring:
  application:
    name: feign-shop-isw
  rabbitmq:
    host: 10.160.2.240
    port: 5672
    username: admin
    password: admin
    listener:
      retry:
        enabled: true #是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
        max-attempts: 2 #最大重试次数
        initial-interval: 500 #重试间隔时间(单位毫秒)
        multiplier: 5 #应用于前一重试间隔的乘法器。

3:消费者配置

@Component
public class TestMq {

    /**
     * 同步订单
     *
     * @param s
     */
    @RabbitHandler
    @RabbitListener(queues = "updateOrderStatusPayEnd")
    public void REDIRECT_QUEUE(String s) {
        System.out.println("DL_QUEUE同步订单数据结果:" + s);
    }

  /**
     * 同步订单
     *
     * @param s
     */
    @RabbitHandler
    @RabbitListener(queues = "updateStatusPayDieMessage")
    public void DL_QUEUE(String s) {
        System.out.println("DL_QUEUE同步订单数据结果-原队列消费成功:" + s);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值