2012-07-12 6 views
9

Ich verwende Spring amqp 1.1 Version als meinen Java-Client. Ich habe eine Warteschlange mit rund 2000 Nachrichten. Ich möchte einen Dienst haben, der diese Warteschlangengröße überprüft, und wenn sie leer ist, sendet sie eine Nachricht mit dem Titel "Alle Artikel verarbeitet".Warteschlangengröße im Frühjahr AMQP Java-Client

Ich weiß nicht, wie man aktuelle Warteschlangengröße bekommt? Bitte helfen

Ich googelte und fand eine Klasse "RabbitBrokerAdmin", die in der früheren Version 1.0 vorhanden war. Ich denke, es ist jetzt nicht in 1.1 vorhanden.

Beliebige Hinweise zum Abrufen der aktuellen Warteschlangengröße?

Antwort

14

So weiß ich, das ist ein wenig spät und eine Lösung bereits gefunden wurde, aber hier ist eine andere Art und Weise zu suchen Nachricht zählt in Ihren Warteschlangen

Diese Lösung setzt voraus, dass Sie die Feder rabbitmq Rahmen verwenden und Ihre Warteschlangen in Ihrer Anwendung Config mit den folgenden Tags definiert

<rabbit:queue> 
<rabbit:admin> 
definiert

Die Java-Klasse:

public class QueueStatsProcessor { 
    @Autowired 
    private RabbitAdmin admin; 
    @Autowired 
    private List<Queue> rabbitQueues; 

    public void getCounts(){ 
     Properties props; 
     Integer messageCount; 
     for(Queue queue : rabbitQueues){ 
      props = admin.getQueueProperties(queue.getName()); 
      messageCount = Integer.parseInt(props.get("QUEUE_MESSAGE_COUNT").toString()); 
      System.out.println(queue.getName() + " has " + messageCount + " messages"); 
     } 
    } 
} 

Sie auch mit dieser Lösung können die aktuellen Verbraucher in die Warteschlange http://docs.spring.io/spring-amqp/docs/1.2.1.RELEASE/api/org/springframework/amqp/rabbit/core/RabbitAdmin.html#getQueueProperties(java.lang.String)

+0

Dank an lesen, ich werde versuchen, auch das. – hellojava

+0

funktioniert wie ein Charme, danke! – Zarathustra

+0

Dies ist die viel bessere Antwort. Viel weniger Hacky. –

10

Sie können die RabbitAdmin Instanz verwenden, um die Details aus der Warteschlange zu erhalten, wie folgt:

@Resource RabbitAdmin admin; 
... 
protected int getQueueCount(final String name) { 
    DeclareOk declareOk = admin.getRabbitTemplate().execute(new ChannelCallback<DeclareOk>() { 
     public DeclareOk doInRabbit(Channel channel) throws Exception { 
      return channel.queueDeclarePassive(name); 
     } 
    }); 
    return declareOk.getMessageCount(); 
}