文档章节

Spring Boot配置多套RabbitMQ

woter
 woter
发布于 2018/07/10 10:51
字数 638
阅读 1021
收藏 1

背景介绍:

为什么要单独来讲解SpringBoot如何配置RabbitMQ?

因为在项目中,有可能会用到多套RabbitMQ,如果只用一套那则用SpringBoot自带的配置就可以了,但多套则不行,需要自行配置。

说明:在这就详解RabbitMq相关内容了:

                                                                --- direct:只匹配对应队列(相当于1对1)
queue --(routingkey)-->exchange --> --- fanout:转发消息到所有绑定队列(相当与一对多)
                                                                --- topic:按规则转发消息(最灵活)
                                                                --- header:设置header attribute参数类型的交换机

不太懂的请百度,不赘述了。

配置方式:

方式1 SpringBoot自带配置:

#spring boot配置
spring.rabbitmq.host=192.168.10.20
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

代码:

@Configuration
public class RabbitConfiguration {
 
    @Bean
    public Queue Queue() {
        return new Queue("demo");
    } 
 
}

public class HelloSender {
 
    @Autowired
    private RabbitTemplate rabbitTemplate;
 
    public void send() {
        String content = "hello " + new Date();
        System.out.println("Sender : " + content );
        this.rabbitTemplate.convertAndSend("hello", content);
    }
 
}

 

方式2 spring xml配置:

<bean id="testTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
		<property name="corePoolSize" value="${rabbit.executor.corePoolSize}" />
		<property name="maxPoolSize" value="${rabbit.executor.maxPoolSize}" />
		<property name="queueCapacity" value="${rabbit.executor.queueCapacity}" />
		<property name="keepAliveSeconds" value="${rabbit.executor.keepAliveSeconds}" />
	</bean>

	<!-- RabbitMQ -->
	<rabbit:connection-factory id="testConnectionFactory" username="${rabbit.username}" password="${rabbit.password}" addresses="${rabbit.address}" virtual-host="${rabbit.virtual}"
		channel-cache-size="${rabbit.channelCacheSize}" requested-heartbeat="${rabbit.requestedHeartbeat}"/>

	<rabbit:template id="testAmqpTemplate" connection-factory="testConnectionFactory" />

	<rabbit:admin connection-factory="providerConnectionFactory" id="testAdmin" />

	<rabbit:queue name="hello" auto-delete="true" durable="false" declared-by="testAdmin" id="helloQueue">
		<rabbit:queue-arguments>
			<entry key="x-message-ttl" value="5000" value-type="java.lang.Long" />
		</rabbit:queue-arguments>
	</rabbit:queue>

	<rabbit:listener-container connection-factory="testConnectionFactory" concurrency="${rabbit.concurrency}" max-concurrency="${remoting.rabbit.maxConcurrency}" task-executor="testTaskExecutor">
		<rabbit:listener queues="helloQueue" ref="helloMessageListener" />
	</rabbit:listener-container>

然后在启动类加上 @ImportResource 

@ImportResource(locations = {"classpath:conf/spring.xml"})
@EnableAutoConfiguration(exclude=RabbitAutoConfiguration.class)
@ComponentScan(value={"com.test.demo"})
@SpringBootApplication
public class DemoApplication{
    
    private static final Logger logger = LoggerFactory.getLogger(PosApplication.class);
    
    public static void main(String[] args) {
	   System.setProperty("spring.config.location", "classpath:conf/env/application.properties");
	   SpringApplication.run(DemoApplication.class, args);
	   logger.info("start completed !");
    }
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
        c.setIgnoreUnresolvablePlaceholders(true);
        return c;
    }
}

 

方式三:编码实现

@Configuration
public class RabbitConfiguration {

    @Resource
    private ErrorHandler messageErrorHandler;
    
    /**
     * 声明connectionFactory
     */
    @Bean(name = "invokeContainerFactory")
    public ConnectionFactory invokeContainerFactory(@Value("${message.rabbit.username}") String username, 
	    @Value("${message.rabbit.password}") String password, 
	    @Value("${message.rabbit.address}") String host,
	    @Value("${message.rabbit.virtual}") String virtual) {
	   CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
	   connectionFactory.setHost(host);
	   connectionFactory.setVirtualHost(virtual);
	   connectionFactory.setUsername(username);
	   connectionFactory.setPassword(password);
	   connectionFactory.setPublisherConfirms(true);
	   return connectionFactory;
    }
    
    /**
     * 声明RabbitAdmin 
     */
    @Bean("messageRabbitAdmin")
    public RabbitAdmin rabbitAdmin(@Qualifier("invokeContainerFactory") ConnectionFactory invokeContainerFactory){
	   return new RabbitAdmin(invokeContainerFactory);
    }
    
    /**
     * 声明queue
     */
    @Bean("testQuene")
    public Queue posFanoutQueue(@Value("${test.queue}") String queueName,@Qualifier("messageRabbitAdmin") RabbitAdmin rabbitAdmin) {
	   Queue que = new Queue(queueName,true);
	   rabbitAdmin.declareQueue(que);
	   return que;
    }

    @Bean("messageFanoutExchange")
    public FanoutExchange defaultExchange(@Value("${rabbit.fanout.exchange}") String exchangeName) {
	   return new FanoutExchange(exchangeName);
    }
    
    /**
     * 绑定queue与exchange
     */
    @Bean
    public Binding binding(@Qualifier("testQuene") Queue testQuene, @Qualifier("messageFanoutExchange") FanoutExchange messageFanoutExchange) {
	   return BindingBuilder.bind(testQuene).to(messageFanoutExchange);
    }
    
    /**
     * 声明MessageListenerContainer
     */
    @Bean(name = "testListenerContainerFactory")
    public SimpleMessageListenerContainer insMessageListenerContainer(@Qualifier("testQuene") Queue testQuene, 
	    @Qualifier("invokeContainerFactory") ConnectionFactory invokeContainerFactory, 
	    @Qualifier("testMessageListener") MessageListener testMessageListener) {
	
	   SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer();
	   messageListenerContainer.setConnectionFactory(invokeContainerFactory);
	   messageListenerContainer.addQueues(testQuene);
	   messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
	   messageListenerContainer.setErrorHandler(messageErrorHandler);
	   messageListenerContainer.setMessageListener(testMessageListener);
	   return messageListenerContainer;
    }

    @Bean(name = "broadcastRabbitTemplate")
    public RabbitTemplate imsRabbitTemplate(@Qualifier("invokeContainerFactory") ConnectionFactory connectionFactory) {
	   return new RabbitTemplate(connectionFactory);
    }

}

 

© 著作权归作者所有

woter
粉丝 55
博文 114
码字总数 61479
作品 0
深圳
技术主管
私信 提问
Spring Boot RabbitMQ 优先级队列

Docker With RabbitMQ 官方 Docker 镜像仓库地址 https://hub.docker.com/_/rabbitmq 本地运行 RabbitMQ 访问可视化面板 地址:http://127.0.0.1:15672/ 默认账号:guest 默认密码:guest S...

Anoyi
02/23
0
0
RabbitMQ 入门 与 RabbitMQ 在 Spring Boot 中的使用

Message Broker与AMQP简介 Message Broker是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚集...

Anur
2018/09/13
414
0
Spring Boot整合RabbitMQ实例

什么是消息? 消息是一个或者多个实体之间沟通的一种方式并且无处不在。 自从计算机发明以来,计算机以多种多样的方式发送消息,消息定义了软硬件或者应用程序之间的沟通方式。消息总是有一个...

英雄有梦没死就别停
2018/06/27
262
1
企业级 Spring Boot 教程(十五)Springboot整合RabbitMQ

这篇文章带你了解怎么整合RabbitMQ服务器,并且通过它怎么去发送和接收消息。我将构建一个springboot工程,通过RabbitTemplate去通过MessageListenerAdapter去订阅一个POJO类型的消息。 准备...

itcloud
2018/10/30
177
0
Spring Boot与RabbitMQ结合实现延迟队列的示例

背景 何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。 场景一:在订单系统中,一个用户下单之后通常有...

xiaomin0322
2018/05/11
652
0

没有更多内容

加载失败,请刷新页面

加载更多

【0911】linux软件包安装和卸载

【0911】linux软件包安装和卸载 一、安装软件包的三种方法 1、rpm工具:与win中的exe安装包类似,红帽子公司包管理系统 2、yum工具:属于一种用python开发的工具,支持自动的安装依赖的包 3、...

飞翔的竹蜻蜓
31分钟前
3
0
【外行学IT】手机网页自适应之rem和viewport

在写手机网页时,对于像素的问题会非常困惑,初学者很多时候会因为那么一个小点的问题解决不了,或者无法理解透彻就放弃了学习。 我在学习写手机网页时也困惑了许久,出现过下面的问题: 图片...

前端老手
42分钟前
5
0
三、Java设计模式之单一职责原则

定义:不要存在多于一个导致类变更的原因。 一个类、接口、方法只负责一项职责 优点:降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险

东风破2019
49分钟前
4
0
搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) KaliArch关注1人评论28269人阅读2017-12-04 21:57:41 MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https:/...

linjin200
今天
6
0
Pandas DataFrame创建方法大全

Pandas是Python的数据分析利器,DataFrame是Pandas进行数据分析的基本结构,可以把DataFrame视为一个二维数据表,每一行都表示一个数据记录。本文将介绍创建Pandas DataFrame的6种方法。 创建...

汇智网教程
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部