爲何要單獨來說解SpringBoot如何配置RabbitMQ?java
由於在項目中,有可能會用到多套RabbitMQ,若是隻用一套那則用SpringBoot自帶的配置就能夠了,但多套則不行,須要自行配置。spring
說明:在這就詳解RabbitMq相關內容了:bash
--- direct:只匹配對應隊列(至關於1對1)
queue --(routingkey)-->exchange --> --- fanout:轉發消息到全部綁定隊列(至關與一對多)
--- topic:按規則轉發消息(最靈活)
--- header:設置header attribute參數類型的交換機app
#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); } }
<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); } }