异步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
  

  

  

  

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM