遵从AMQP(高级消息队列协议Advanced Message Queuing Protocol),协议模型:
Publisher application(消息生产者)把消息投递到消息中间件的Server上经过Virtual host(虚拟主机)到达Exchange(交换机),
另一边的Consumer application(消息消费者)只需监听Message Queue(消息对列),其中交换机和消息队列有一个绑定关系(通过一定的Routing key(路由键)Binding关联),
即交换机把消息生产者投递上来的消息路由到消息队列中供消息消费者消费(一个虚拟主机中的交换机和消息队列不能是一样的)
@Component//设置为组件
public class OrderSender {
@Autowired
private RabbitTemplate rabbitTemplate;//springboot提供了自动装配的消息发送模板
//发消息
public void sendOrder(Order order) throws Exception {
CorrelationData correlationData =new CorrelationData();
correlationData.setId(order.getMessageId());
rabbitTemplate.convertAndSend("order-exchange",//exchange
"order.0000",//routingKey
order, //object消息体内容
correlationData);//correlationData消息唯一id(需要创建)
}
}
浏览器MQ控制台创建Exchange和消息队列,绑定
测试:
@Autowired
private OrderSender orderSender;
@Test
public void testSend0() throws Exception {
Order order = new Order();
order.setId(0);
order.setName("");
order.setMessageId("000000000000");//写个唯一算法
orderSender.sendOrder(order);
}
@Component
public class OrderReceiver {
/**
* 监听接收消息
* @param order
* @param map
* @param channel
* @throws Exception
*/
@RabbitListener(bindings=@QueueBinding(
value = @Queue(value = "order-queue",durable = "true"),
exchange = @Exchange(name = "order-exchange",durable = "true",type = "topic"),
key = "order.*"
)
)//指定监听的队列并且可以自动创建Exchange,queue和添加路由键自动绑定
@RabbitHandler
public void onOrderMessage (@Payload Order order,//消息实体
@Headers Map<String, Object> map,//消息头
Channel channel//手工签收依赖Channel
) throws Exception {
//消息消费
System.out.println("开始消费");
System.out.println("订单信息"+order.getId());
//手工确认
channel.basicAck((Long)map.get(AmqpHeaders.DELIVERY_TAG),//deliveryTag(告诉mq已经收到消息)
false);//multiple(是否支持批量签收)
}
}