2016-04-10 15 views
0

私はRabbitMQとJavaで作業しています。 私は、キューにメッセージを送信し、別のキューに返信を待つexecuteLogin()メソッド、持っている:返されたメッセージは、isSuccess分野における真の含まれている場合、私はの呼び出し元にを返す必要がありますがexecuteLogin()メソッドは、isSuccessがfalseの場合、私はfalse(ログに記録されていない)を返す必要があります。 私はこの方法を試してみました:RabbitMQ Javaコンシューマからメッセージを返す方法

GetResponse response = channel.basicGet(reply_to, false); 
if(response == null){ 
    System.out.println("No message"); 
}else{ 
    byte[] body = response.getBody(); 
    String msg = new String(body, "UTF-8"); 
    System.out.println(msg); 
} 

しかし、両方の方法で、私は私の問題解決することはできません:

boolean logged = false; 
Consumer consumer = new DefaultConsumer(channel) { 
    @Override 
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { 
     String message = new String(body, "UTF-8"); 
     LoginConfirmation confirm = gson.fromJson(message, LoginConfirmation.class); 
     channel.queueDelete(reply_to); 
     System.out.println(" [x] Received '" + message + "'"); 
     LOGGER.log(Level.FINE, gson.toJson(confirm)); 
     logged = confirm.isSuccess(); 
    } 
}; 
channel.basicConsume(reply_to, true, consumer); 

またはこのよう最初の方法で を、それはfalseを返しますが、それは印刷しますメッセージ( "isSuccess":true)。 2番目の方法では、 "no message"が表示されます。

私はbasicConsumeとdefaultConsumerが非同期のですので、最初はメッセージを取得しませんが、それを取得すると印刷されるという問題があると思います。

答えて

0

はい、通信は非同期です。

はあなたのケースでは、私が思うに、RPCパターンが適切である:

https://www.rabbitmq.com/tutorials/tutorial-six-java.html

しかし、我々は、リモートコンピュータ上で機能を実行し、その結果について を待つ必要がある場合は?まあ、それは別の話です。このパターンは、リモートプロシージャコールまたはRPCとして一般に知られている です。

+0

ええ、ありがとうございますが、問題は、私はサーバーコンポーネントを実現していない、クライアントだけです。 私はメッセージを送ってきました、そして、私はキューのメッセージを待って、定義されたrouting_keyで、メッセージを分析して、何かを呼び出し側に返します。 これは可能ですか? – luca89pe

関連する問題