springamqp rabbit 延时消息

该博客介绍了如何在SpringAMQP中配置并使用RabbitMQ的延迟消息功能。首先,博主展示了如何安装rabbitmq_delayed_message_exchange插件,然后通过创建RabbitTemplate和配置监听容器工厂来设置确认和返回回调。接着,博主定义了交换机、队列和绑定,并发送带有延迟属性的消息。最后,提供了一个接收端点来处理延迟消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装rabbitmq_delayed_message_exchange插件

插件下载地址:http://www.rabbitmq.com/community-plugins.html

下载完插件后,将其放置到RabbitMQ安装目录下的 plugins 目录下,并使用如下命令启动这个插件:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

systemctl restart rabbitmq-server

上代码:

 

package com.study.soufang.rabbit.a003.springboot.rabbitmq;

import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.amqp.rabbit.support.CorrelationData;

public class MyConfirmCallback implements ConfirmCallback {

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // TODO Auto-generated method stub
        System.out.println("correlationData:"+correlationData+",ACK:"+ack+",Cause:"+cause);
    }

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

package com.study.soufang.rabbit.a003.springboot.rabbitmq;

import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRabbitConfiguration {

    private RabbitProperties properties;
    MessageConverter messageConverter = new Jackson2JsonMessageConverter();
    @Bean
    @ConditionalOnMissingBean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        PropertyMapper map = PropertyMapper.get();
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setConfirmCallback(new MyConfirmCallback());
        template.setReturnCallback(new MyReturnCallback());
        template.setMessageConverter(messageConverter);
        //mandatory 默认为FALSE,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,会直接将消息扔掉
        template.setMandatory(true);
        return template;
    }
    
    
    @Bean(name = "rabbitListenerContainerFactory")
    @ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")
    @ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple", matchIfMissing = true)
    public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
            SimpleRabbitListenerContainerFactoryConfigurer configurer,
            ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        factory.setMessageConverter(messageConverter);
        return factory;
    }
    
}
--------------------------------------------------------------------------------------------------------------------------------------------------------

package com.study.soufang.rabbit.a003.springboot.rabbitmq;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;

public class MyReturnCallback implements ReturnCallback {

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("Message : "+ message);
        System.out.println("replyCode : "+ replyCode);
        System.out.println("replyText : "+ replyText);
        System.out.println("exchange : "+ exchange);
        System.out.println("routingKey : "+ routingKey);
    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.study.soufang.rabbit.a003.springboot.rabbitmq;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRabbitDeclareConfiguration {

    public static final String EXCHANGE_NAME_TEST = "order";
    public static final String QUEUE_NAME_TEST = "springboot.rabbit.test.exchange.queue";
    public static final String EXCHANGE_ROUTINGKEY_TOPIC = "test.*";
    
    @Autowired
    AmqpAdmin amqpAdmin;
    
    @Bean
    public Exchange testExchange(){

        //注意delayed(),设置延时
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME_TEST).delayed().build();
    }
    
    @Bean
    public Queue testExchangeQueue(){
        Queue queue = new Queue(QUEUE_NAME_TEST);
        amqpAdmin.declareQueue(queue);
        return queue;
    }
    
    @Bean
    public Binding bind1(){
        return BindingBuilder.bind(testExchangeQueue()).to(testExchange()).with(EXCHANGE_ROUTINGKEY_TOPIC).noargs();
    }
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.study.soufang.rabbit.a003.springboot.rabbitmq.topic;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.study.soufang.rabbit.a003.springboot.rabbitmq.MyRabbitDeclareConfiguration;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.User;

@Component
public class TestRecvTopic {

    @RabbitListener(queues=MyRabbitDeclareConfiguration.QUEUE_NAME_TEST)
    public void process(User user){
        System.out.println("receive from top exchange : "+user);
    }
    
}
 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.study.soufang.rabbit.a003.springboot.rabbitmq.topic;

import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.study.soufang.rabbit.a003.springboot.rabbitmq.MyRabbitDeclareConfiguration;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.User;

@Component
public class TestSendTopic {

    @Autowired
    AmqpAdmin amqpAdmin;
    @Autowired
    AmqpTemplate amqpTemplate;
    
    public void send(){
        amqpTemplate.convertAndSend(MyRabbitDeclareConfiguration.EXCHANGE_NAME_TEST, 
                MyRabbitDeclareConfiguration.EXCHANGE_ROUTINGKEY_TOPIC, 
                new User().setId(16).setName("张大朋"),new MessagePostProcessor() {
                    
                    @Override
                    public Message postProcessMessage(Message message) throws AmqpException {
                        //设置延迟消费时间10秒
                        message.getMessageProperties().setDelay(10000);
                        return message;
                    }
                });
        System.out.println("发送消息");
    }
    
}
 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

package com.study.soufang.rabbit.a003.springboot.rabbitmq;

import java.io.Serializable;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain=true)
public class User implements Serializable{

    private Integer id;
    private String name;
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值