Server:提供服務的服務,RPC模型中的Server
Client: 調用服務的服務,RPC模型中的client
監聽了sms
隊列,這個隊列將會是客戶端請求消息發送到的隊列,配置了適配器,適配器中去調用服務,適配器返回的值就是服務端返回給客戶端的RPC調用的結果
@RabbitListener(bindings = @QueueBinding( value = @Queue(value = "sms-queue", durable = "true"), exchange = @Exchange(name = "sms-exchange", type = "topic"), key = "sms.*" )) @RabbitHandler public String onSmsMessage(@Payload Sms sms, @Headers Map<String, Object> headers, Channel channel) throws InterruptedException, IOException { log.info("------------進入RPC調用...------------------"); String phone = sms.getPhone(); String content = sms.getContent(); String result = SMSTool.sendSMS(phone, content); TimeUnit.SECONDS.sleep(6); Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG); channel.basicAck(deliveryTag, false); log.info("確認的tag:{}", deliveryTag); return result; }
消息處理方法,一定要有返回值,這個返回值就是就是server回復客戶端的結果
客戶端
public void sendSms(Sms sms) throws InterruptedException { MessageProperties messageProperties = new MessageProperties(); messageProperties.setContentType("application/json"); Object result = rabbitTemplate.convertSendAndReceive("sms-exchange", "sms.abc", sms); log.info("reply: {}", result); }
如果服務端睡眠6s,則客戶端通過sendAndReceive
方法接收到的Message
對象為空,怎樣設置呢?客戶端通過設置rabbitTemplate.setReplyTimeout(10000);
就可以了。
- 使用
sendAndReceive
方法發送消息,該方法返回一個Message對象,該對象就是server返回的結果 sendAndReceive
如果超過5s還沒有收到結果,則返回null,這個超時時間可以通過rabbitTemplate.setReplyTimeout()
來進行設置- server端返回的結果一定要注意,和
MessageConverter
有關,默認的org.springframework.amqp.support.converter.SimpleMessageConverter
會把基本的數據類型轉換成Serializable
對象,這樣的話,client端接收的也是序列化的java對象,所以,需要合理設置MessageConverter
。