背景介绍:
为什么要单独来讲解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);
}
}
来源:oschina
链接:https://my.oschina.net/u/559627/blog/1843401