简介:MQ全称为Message Queue, 消息队列是一种应用程序对应用程序的通信方法,RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。可解耦,支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Loadbalance)或者数据持久化都有很好的支持。
Springboot_RabbitMQ
pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
yml:
spring:
rabbitmq:
addresses: a6dev.epai.io:5672
username: guest
password: guest
listener: # ack 手动机制
simple:
acknowledge-mode: manual
@Configuration
public class RabbitConfig {
/**
* 创建消息队列
* @Author Guanxiangfu
* @Date 2017/11/23 18:42
*/
@Bean(name="send")
public Queue queueMessage() {
return new Queue("send");
}
/**
* 创建消息队列
* @Author Guanxiangfu
* @Date 2017/11/23 18:42
*/
@Bean(name="message")
public Queue queueMessages() {
return new Queue("message");
}
/**
* 创建交换器,管理接收类
* @Author Guanxiangfu
* @Date 2017/11/23 18:41
*/
@Bean
public TopicExchange exchange() {
return new TopicExchange("exchange");
}
/**
* todo:以下绑定消息队列创建完后可以不写,因为会自动匹配
* @Author Guanxiangfu
* @Date 2017/11/24 10:56
*/
/**
* 绑定队列
* @Author Guanxiangfu
* @Date 2017/11/23 18:43
*/
@Bean
Binding bindingExchangeMessage(@Qualifier("send") Queue queueMessage, TopicExchange exchange) {
return BindingBuilder.bind(queueMessage).to(exchange).with("send");
}
/**
* 绑定队列
* @Author Guanxiangfu
* @Date 2017/11/23 18:43
*/
@Bean
Binding bindingExchangeMessages(@Qualifier("message") Queue queueMessages, TopicExchange exchange) {
return BindingBuilder.bind(queueMessages).to(exchange).with("message");
}
}
@Autowired
private AmqpTemplate rabbitTemplate;
@RabbitHandler
public void processSend(String routingKey) {
Object o = this.rabbitTemplate.receiveAndConvert(routingKey);
log.info("Receiver : " + o);
}
rabbitTemplate.convertAndSend(routingKey,message);
@Autowired
private AmqpTemplate rabbitTemplate;
@Autowired
ConnectionFactory connectionFactory;
Channel channel=connectionFactory.createConnection().createChannel(false);
channel.queueDeclare(routingKey, true, false, false, null);
channel.queueBind(routingKey, exchange, routingKey);
log.info("Sender : " + message);
rabbitTemplate.convertAndSend(routingKey,message);
//channel.basicAck(string.getMessageProperties().getDeliveryTag(), false); // 消息的标识,false只确认当前一个消息收到,true确认所有consumer获得的消息
channel.basicNack(string.getMessageProperties().getDeliveryTag(), false, true); // ack返回false,并重新回到队列,api里面解释得很清楚
//channel.basicReject(string.getMessageProperties().getDeliveryTag(), true); // 拒绝消息