异步RPC调用

        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。
    立志如山 静心求实
 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号