Spring Boot配置多套RabbitMQ

背景介绍:

为什么要单独来讲解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);
    }

}

 

转载于:https://my.oschina.net/woter/blog/1843401

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值