Spring Boot配置多套RabbitMQ

背景介紹:

爲何要單獨來說解SpringBoot如何配置RabbitMQ?java

由於在項目中,有可能會用到多套RabbitMQ,若是隻用一套那則用SpringBoot自帶的配置就能夠了,但多套則不行,須要自行配置。spring

說明:在這就詳解RabbitMq相關內容了:bash

                                                                --- direct:只匹配對應隊列(至關於1對1)
queue --(routingkey)-->exchange --> --- fanout:轉發消息到全部綁定隊列(至關與一對多)
                                                                --- topic:按規則轉發消息(最靈活)
                                                                --- header:設置header attribute參數類型的交換機app

不太懂的請百度,不贅述了。

配置方式:

方式1 SpringBoot自帶配置:

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

代碼:ide

@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 ui

@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);
    }

}
相關文章
相關標籤/搜索