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
。