RabbitMQ

死信交换机一、队列延迟

@Bean("queueA")
public Queue queueA(){
    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-dead-letter-exchange",Y_EXCHANGE);
    arguments.put("x-dead-letter-routing-key","YD");
    arguments.put("x-message-ttl",10*1000);
    return QueueBuilder.nonDurable(QUEUE_A).withArguments(arguments).build();
}

死信交换机二、交换机设置延迟

    @RequestMapping("/sendExpMsg/{msg}/{time}")
    @ResponseBody
    public String sengdExpMsg(@PathVariable("msg")String msg,@PathVariable("time")String time ){
        rabbitTemplate.convertAndSend("X", "XC", msg, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration(time);
                return message;
            }
        });
        log.info("发送延迟消息成功,发送时间为{},发送内容为{},延迟时间为{}毫秒",new Date().toString(),msg,time);
        return "发送延迟消息成功!~~~~";
    }

延迟交换机delayedExchange配置类

@Configuration
public class DelayedMessageConfig {

    public static final String DELAYED_QUEUE_NAME="delayed.queue";
    public static final String DELAYED_EXCHANGE="delayed.exchange";
    public static final String DELAYED_ROUTINGKEY="delayed.routingkey";

    @Bean("queueDelayed")
    public Queue queueDelayed(){
        return QueueBuilder.nonDurable(DELAYED_QUEUE_NAME).build();
    }

    @Bean("exchangeDelayed")
    public CustomExchange exchangeDelayed(){
        Map<String, Object> arguments=new HashMap<>();
        arguments.put("x-delayed-type","direct");
        return new CustomExchange(DELAYED_EXCHANGE,"x-delayed-message",false,false,arguments);
    }

    @Bean
    public Binding qDBingdingExD(@Qualifier("queueDelayed")Queue qD,@Qualifier("exchangeDelayed")CustomExchange exD){
        return BindingBuilder.bind(qD).to(exD).with(DELAYED_ROUTINGKEY).noargs();
    }
}

延迟交换机delayedExchange发送延迟消息

    @RequestMapping("/sendDelayedMsg/{msg}/{time}")
    @ResponseBody
    public String sengdDelayedMsg(@PathVariable("msg")String msg,@PathVariable("time")Integer time ){
        rabbitTemplate.convertAndSend(DelayedMessageConfig.DELAYED_EXCHANGE, DelayedMessageConfig.DELAYED_ROUTINGKEY, msg, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setDelay(time);
                return message;
            }
        });
        log.info("发送延迟消息成功,发送时间为{},发送内容为{},延迟时间为{}毫秒",new Date().toString(),msg,time);
        return "发送延迟消息成功!~~~~";
    }

备份交换机配置类

    @Bean("exchangeConfirm")
    public DirectExchange exchangeConfirm(){
        return ExchangeBuilder.directExchange(EXCHANGE_NAME).withArgument("alternate-exchange",BACKUP_EXCHANGE).build();
    }

确认回调接口及回退消息回调接口

@Slf4j
@Component
public class MyConfirmCallback implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback{
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        String id = correlationData!=null?correlationData.getId():"";
        if(ack){
            log.info("接收到了id为{}的消息",id);
        }else {
            log.info("没有收到id为{}的消息",id);
        }
    }

    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        log.info("我是回退消息的回调接口,退回的消息是:{},交换机是{},routingkey是{},回退原因是{}",
                new String(returnedMessage.getMessage().getBody()),
                returnedMessage.getExchange(),returnedMessage.getRoutingKey()
                ,returnedMessage.getReplyText());
    }
}
回退回调接口及备份交换机同时存在,备份交换机优先

pom文件

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

property文件

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirm-type=correlated
spring.rabbitmq.publisher-returns=true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值