RabbitMQ 学习(三) —— rabbitmq整合spring、springboot、springcloudstream

RabbitMQ整合Spring AMQP实战
RabbitAdmin

RabbitAdmin类可以很好的操作RabbitMQ,在Spring中直接进行注入即可。(注意:autoStartup必须要设置为true,否则Spring容器不会加载RabbitAdmin类)

RabbitAdmin底层实现就是从Spring容器中获取Exchange、Bingding、RoutingKey以及Queue的@Bean声明。

然后使用RabbitTemplate的execute方法执行对应的声明、修改、删除等一系列RabbitMQ基础功能操作。例如:添加一个交换机、删除一个绑定、清空一个队列里的消息等等。

pom.xml:加入依赖。

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.8.0</version>
        </dependency>

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

RabbitMQConfig:将rabbitAdmin交给spring处理。

@Configuration
public class RabbitMQConfig {
   

    @Bean
    public ConnectionFactory connectionFactory() {
   
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses("localhost:5672");
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        return connectionFactory;
    }

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
   
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }
}

rabbitAdmin 能够创建交换机、队列、绑定,也提供了清空队列等操作。

    @Autowired
    private RabbitAdmin rabbitAdmin;

    @Test
    public void testAdmin() throws Exception {
   
        //创建交换机
        rabbitAdmin.declareExchange(new DirectExchange("test.direct", false, false));

        rabbitAdmin.declareExchange(new TopicExchange("test.topic", false, false));

        rabbitAdmin.declareExchange(new FanoutExchange("test.fanout", false, false));

        //创建队列
        rabbitAdmin.declareQueue(new Queue("test.direct.queue", false));

        rabbitAdmin.declareQueue(new Queue("test.topic.queue", false));

        rabbitAdmin.declareQueue(new Queue("test.fanout.queue", false));

        //创建绑定
        rabbitAdmin.declareBinding(new Binding("test.direct.queue",
                Binding.DestinationType.QUEUE, "test.direct", "direct", new HashMap<>()));

        rabbitAdmin.declareBinding(BindingBuilder.bind(
                new Queue("test.topic.queue", false)) //直接创建队列
                .to(new TopicExchange("test.topic", false, false)) //直接创建交换机 建立关联关系
                .with("user.#")); //指定路由键

        rabbitAdmin.declareBinding(
                BindingBuilder.bind(new Queue("test.fanout.queue", false))
                .to(new FanoutExchange("test.fanout", false, false)));

        //清空队列
        rabbitAdmin.purgeQueue("test.topic.queue",false);
    }
Spring AMQP 中声明交换机、队列、绑定

使用Spring AMQP只要声明成@Bean 就可以帮我我们自动创建。

    /**
     * 针对消费者配置
     * 1、设置交换机类型
     * 2、将队列绑定到交换机
     * FanoutExchange: 将消息分发到所有绑定队列,无routingkey的概念
     * HeadersExchange: 通过添加属性key-value匹配
     * DirectExchange: 按照routingkey分发到指定队列
     * TopicExchange: 多关键字匹配
     */
    @Bean
    public TopicExchange exchange001() {
   
        return new TopicExchange("topic001", true, false);
    }

    @Bean
    public Queue queue001() {
   
        return new Queue("queue001", true);//队列持久
    }

    @Bean
    public Binding binding001() {
   
        return BindingBuilder.bind(queue001()).to(exchange001()).with("spring.*");
    }
RabbitTemplate

消息模版,我们在与Spring AMQP整合的时候进行发送消息的关键类。

该类提供了丰富的发送消息方式,包括可靠性投递消息方法、回调监听消息接口ConfirmCallback、返回值确认接口ReturnCallback等等。同样我们需要进行注入到Spring容器中,然后直接使用。

在spring中注入RabbitTemplate

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
   
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        return rabbitTemplate;
    }

使用RabbitTemplate发送消息

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessage() throws Exception {
   
        //第一种方式
        MessageProperties properties = new MessageProperties();
        properties.getHeaders().put("desc", "信息描述..");
        properties.getHeaders().put("type", "自定义消息类型..");
        Message message = new Message("Hello RabbitMQ".getBytes(), properties);

        rabbitTemplate.convertAndSend("topic001", "spring.amqp", message, new MessagePostProcessor() {
   
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
   
                System.err.println("------添加额外的配置--------"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值