Java中动态声明与绑定Rabbit MQ队列以及延迟队列的实现与使用

本文介绍了如何在Java中动态声明和绑定Rabbit MQ队列,以及如何配置和使用延迟队列。通过Spring AMQP 1.7.7版本,不使用数据对象转化,详细讲解了生产者和消费者配置,以及延迟队列的两种实现方式,强调了配置和使用延迟队列的注意事项。
摘要由CSDN通过智能技术生成
一 概述

通常,我们会通过Spring schemal来配置队列基础设施、队列声明以及绑定等功能,这样让我们能够很方便的通过Spring注入对象去使用它,但有不足之处就是,在项目中如果我们想要多个队列去分担不同的任务,此时我们不得不创建很多不同的Rabbit MQ Spring schemal,那么这种做法就显得太过繁琐与笨重了。反之,在Java代码里动态的去声明和绑定队列,就会方便很多了,而在schemal中我们只需引入Rabbit MQ的相关配置即可。本篇博客会讲解如何在Java代码中动态的声明与绑定队列以及延迟队列的实现。

注意:

  • 本篇博客介绍的是Java语言下的使用,客户端使用的是Spring AMQP,版本为1.7.7(详情见pom.xml);
  • 本篇博客不使用Rabbit MQ的数据对象转化,如有需要须自行实现;
  • 代码中声明的Exchange都为D型的,如果需要别的类型,可自行抽取代码。
二 配置Rabbit MQ
  • pom.xm 引入Spring AMQP
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>1.7.7.RELEASE</version>
</dependency>
  • 在 config.properties(一个自定义的属性配置文件)中配置Rabbit MQ相关,需要在Spring的schemal 中导入
# Rabbit MQ
rabbit.username=test
rabbit.password=123123
rabbit.port=5672
rabbit.host=192.168.30.218
rabbit.virtual.host=/rabbit
  • 编写applicationContext-rabbitmq.xml schemal
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/rabbit
           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <rabbit:connection-factory id="rabbitMqConnectionFactory"
                               host="${rabbit.host}" port="${rabbit.port}"
                               username="${rabbit.username}"
                               password="${rabbit.password}"
                               virtual-host="${rabbit.virtual.host}"
                               channel-cache-size="300"
                               publisher-confirms="true"/>

    <rabbit:template id="rabbitAmqpTemplate" connection-factory="rabbitMqConnectionFactory"/>

    <rabbit:admin id="rabbitAdmin" connection-factory="rabbitMqConnectionFactory"/>

</beans>
  • 抽取生产者和消费者公共配置接口IRabbitMqConfig
package com.bell.rabbitmq;

/**
 * @Author: yqs
 * @Date: 2019/1/25
 * @Time: 18:33
 * Copyright © Bell All Rights Reserved.
 */
public interface IRabbitMqConfig {
   

    /**
     * queue name
     *
     * @return
     */
    String queueName();

    /**
     * queue exchange name
     *
     * @return
     */
    String queueExchangeName();

    /**
     * queue route key
     *
     * @return
     */
    String queueRouteKey();

}
  • 抽取生产者和消费者公共配置抽象类AbstractRabbitMqBase并实现IRabbitMqConfig接口,但在抽象类型不实现IRabbitMqConfig接口
package com.bell.rabbitmq;

import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @Author: yqs
 * @Date: 2019/1/25
 * @Time: 18:37
 * Copyright © Bell All Rights Reserved.
 */
public abstract class AbstractRabbitMqBase implements IRabbitMqConfig {
   

    @Resource
    private RabbitAdmin rabbitAdmin;

    @Resource
    private RabbitTemplate rabbitAmqpTemplate
感谢您的提问!在 Spring Boot 集成 RabbitMQ,可以使用 AMQP 协议来实现消息的发送和接收。在动态创建交换机和队列时,可以使用 RabbitAdmin 进行管理。简单来说,您可以在应用程序创建一个 RabbitAdmin bean,然后使用它来声明交换机、队列绑定,并使用它来发布和消费消息。以下是一个简单的示例: @Configuration public class RabbitConfig { @Autowired private ConnectionFactory connectionFactory; @Bean public RabbitAdmin rabbitAdmin() { return new RabbitAdmin(connectionFactory); } @Bean public SimpleMessageListenerContainer listenerContainer() { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); container.setQueues(myQueue()); container.setMessageListener(new MyMessageListener()); return container; } @Bean public Queue myQueue() { return new Queue("myQueue"); } @Bean public DirectExchange myExchange() { return new DirectExchange("myExchange"); } @Bean public Binding myBinding() { return BindingBuilder.bind(myQueue()).to(myExchange()).with("myKey"); } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate template = new RabbitTemplate(connectionFactory); template.setExchange("myExchange"); template.setRoutingKey("myKey"); return template; } } 在上面的示例,我们使用 @Configuration 注解来告诉 Spring Boot,我们正在创建一个配置类。我们还使用 @Autowired 注注入 ConnectionFactory 类,因为它是与 RabbitMQ 进行通信的关键。 然后,我们创建了一个 RabbitAdmin bean,该 bean 可以使用我们的 connectionFactory 来管理交换机、队列绑定。我们还创建了一个 SimpleMessageListenerContainer bean,该 bean 可以监听我们的队列并处理来自队列的消息。 我们还创建了一个 Queue bean、一个 DirectExchange bean 和一个 Binding bean,这些 bean 是动态创建交换机、队列绑定的关键。我们将它们添加到 RabbitAdmin ,以便在应用程序运行时动态创建它们并将它们绑定在一起。 最后,我们创建了一个 RabbitTemplate bean,该 bean 可以使用我们的 connectionFactory 来发布消息。我们设置了 exchange 和 routingKey 属性,以便在发布消息时指定它们的目标。 这是一个非常基本的示例,仅仅涵盖了 RabbitMQ 动态创建交换机和队列的基本概念。实际上,您可能需要更复杂的配置来满足您的需求,但是这个示例可以作为一个起点,让您开始使用 Spring Boot 和 RabbitMQ。希望对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值