转自:http://backend.blog.163.com/blog/static/2022941262014315104836716/
在发送消息的时候也能够带上一些属性,以支持类似rpc的功能。在rabbitmq文档例子里,实现rpc功能实际上就是client发送带属性的消息,属性中包含回调tmp_queue名和用于标示该消息的correlationId。server端收到消息后从属性中取得tmp_queue,将处理的结果放在该queue中,并将拿到的correlationId作为结果消息的属性一并发送。client端有个while循环一直阻塞并获取tmp_queue消息,直到拿到响应消息并匹配correlationId一致后退出循环,表示拿到了rpc的响应。采用此方式实现rpc的好处是一旦一个server太慢,可以简单的启动一个新的server去读取queue并响应即可。
//创建消息属性(replayTo属性常用于指定回调queue,correlationId属性常用于指定在大量回调queue中的消息哪个是属于该发送消息的回复。在rabbitmq中这些属性没有特殊作用)
BasicProperties props = new BasicProperties().builder().correlationId("id1").replyTo("temp_queue").build();
//发送时带上消息属性(AMQP协议有14种属性之多,但是实际上很少有用)
channel.basicPublish("", QUEUE_NAME, props, message.getBytes());
//接收消息时获取属性:
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
BasicProperties props = delivery.getProperties();