MQ 削峰、解耦、异步,但是提高了系统复杂性,一致性问题。
1 Spring Boot对RabbitMQ的使用做了自动配置,更加的简化了我们的使用。
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在application.properties文件中配置RabbitMQ的连接信息:
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=tangtang
spring.rabbitmq.password=123123
spring.rabbitmq.virtual-host=/tang
会自动创建连接org.springframework.amqp.rabbit.connection.ConnectionFactory对象。
注入到想要的位置。
/**
* RabbitMq配置中心,由SpringBoot提供的相关包自动整合
*
* @author Tang 2017年11月19日
*/
@Configuration
@PropertySource(value = "classpath:rabbitmq.properties")
public class RabbitMqConfig {
private final String QUEUE_NAME = "RABBITMQ-TEXT-QUEUE";
/**
* 在全局配置中按要求配置,会自动将连接注入到这里
*/
@Autowired
private ConnectionFactory connectionFactory;
// 管理
@Bean
public RabbitAdmin rabbitAdmin() {
return new RabbitAdmin(connectionFactory);
}
// 声明队列
@Bean
public Queue rabbitTextQueue() {
// 默认就是自动声明的
return new Queue(QUEUE_NAME, true);
}
/**
* 配置监听连接
*/
@Bean(name = "rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
ConnectionFactory connectionFactory, RabbitProperties config) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
RabbitProperties.Listener listenerConfig = config.getListener();
factory.setAutoStartup(listenerConfig.isAutoStartup());
if (listenerConfig.getAcknowledgeMode() != null) {
factory.setAcknowledgeMode(listenerConfig.getAcknowledgeMode());
}
if (listenerConfig.getConcurrency() != null) {
factory.setConcurrentConsumers(listenerConfig.getConcurrency());
}
if (listenerConfig.getMaxConcurrency() != null) {
factory.setMaxConcurrentConsumers(listenerConfig
.getMaxConcurrency());
}
if (listenerConfig.getPrefetch() != null) {
factory.setPrefetchCount(listenerConfig.getPrefetch());
}
if (listenerConfig.getTransactionSize() != null) {
factory.setTxSize(listenerConfig.getTransactionSize());
}
return factory;
}
/**
* 具体监听队列及使用配置
*
* @param message
* @throws Exception
*/
@RabbitListener(queues = QUEUE_NAME, containerFactory = "rabbitListenerContainerFactory")
public void handleMessage(String message) throws Exception {
// 具体处理
}
}