2016-04-10 13 views
0

Ich arbeite mit RabbitMQ und Java. Ich habe eine ExecuteLogin() Methode, die in einer Warteschlange eine Nachricht sendet, und warten Sie eine Antwort auf eine andere Warteschlange: Wenn die zurückgegebene Nachricht im isSuccess Feld wahr enthält, ich wahr an den Anrufer zurückkommen müssen von die Methode executeLogin(), wenn isSuccess false ist, muss ich false (nicht protokolliert) zurückgeben. Ich habe versucht, auf diese Weise:RabbitMQ wie Nachricht von Java-Verbraucher

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

oder so:

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

Aber in beiden Richtungen, kann ich mein Problem nicht lösen: in der ersten Art und Weise, gibt es falsch, aber er druckt die Nachricht (mit "isSuccess": true). Auf die zweite Art druckt es "keine Nachricht".

Ich denke, das Problem ist, dass basicConsume und defaultConsumer sind asynchrone, so am Anfang ist es nicht die Nachricht abzurufen, aber wenn sie es abruft, er druckt es.

Antwort

0

Ja, die Kommunikation ist asynchron.

In Ihrem Fall, ich denke, das RPC Muster angebracht ist:

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

Aber was, wenn wir eine Funktion auf einem entfernten Rechner ausgeführt werden müssen und auf das Ergebnis warten? Nun, das ist eine andere Geschichte. Dieses Muster ist allgemein bekannt als Remote Procedure Call oder RPC.

+0

Ja, danke, aber das Problem ist, dass ich die Serverkomponente, nur den Client nicht realisiert habe. Ich sende eine Nachricht, dann muss ich in einer Warteschlange auf eine Nachricht mit einem definierten routing_key warten, diese Nachricht analysieren und etwas an den Anrufer zurücksenden. Ist das möglich? – luca89pe

Verwandte Themen