2016-04-10 19 views
0

RabbitMQ ve Java ile çalışıyorum. Bir sıraya bir ileti gönderir ve başka sırasına bir cevap beklemek bir executeLogin() yöntemi vardır: dönen mesajı isSuccess alanda gerçek içeriyorsa, ben arayana gerçek dönmek gerekir executeLogin() yöntemi, isSuccess false ise, false (kaydedilmemiş) döndürmem gerekir.RabbitMQ java tüketicisinden mesaj nasıl geri dönülür

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); 

veya bu şekilde: bu şekilde çalıştı

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); 
} 

Ancak her iki yönden, benim sorunu çözemezler: İlk şekilde , yanlış döndürür, ancak yazdırır mesaj ("isSuccess" ile: true). İkinci şekilde, "mesaj yok" yazdırır.

Ben sorun mesajı almak değil başında öylesine basicConsume ve defaultConsumer, asenkron olduğunu düşünüyorum, ama bunu alırken, onu yazdırır.

cevap

0

Evet, iletişim eşzamansızdır.

sen durumda, sanırım, RPC desen uygundur:

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

Ama biz uzak bir bilgisayarda bir işlevi çalıştırmak ve sonuç için beklemek gerekirse? Şey, bu farklı bir hikaye. Bu model, genellikle Uzak Yordam Çağrısı veya RPC olarak bilinen şeklindedir.

+0

Evet, teşekkürler, ama sorun şu ki, sunucu bileşenini, yalnızca istemciyi fark etmemiştim. Bir mesaj gönderiyorum, sonra bir mesajın kuyruğunda beklemeli bir routing_key ile beklemek zorundayım, o mesajı analiz edip arayana bir şeyler yolladım. Bu mümkün mü? – luca89pe

İlgili konular