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