2016-04-11 8 views
1

Ich versuche Subskriptionsstatistiken für mein Thema von Embedded ActiveMQ über meinen JUnit-Test zu erhalten. Ich bin in der Lage, dieses Thema zu abonnieren, eine Nachricht an dieses Thema senden und bin in der Lage, diese Nachricht in meinem Zuhörer/Abonnenten zu empfangen.Ich kann keine eingebettete ActiveMQ-Statistiknachricht empfangen

Wenn ich jedoch versuche, Statistiken von diesem ActiveMQ zu erhalten, erhalten die Verbraucher Zeitüberschreitung. Und wenn ich das "receiveTimeout" nicht addiere, wartet der Verbraucher unbegrenzt auf die Nachricht. Hier ist mein Code für die Statistik:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"); 
    connectionFactory.setStatsEnabled(true); 

    Connection connection = connectionFactory.createConnection(); 
    connection.setClientID(format("ActiveMqStatistics-%s", System.nanoTime())); 
    connection.start(); 

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    Queue replyTo = session.createTemporaryQueue(); 
    MessageConsumer consumer = session.createConsumer(replyTo); 

    String queueName = "ActiveMQ.Statistics.Subscription"; 
    Queue testQueue = session.createQueue(queueName); 
    MessageProducer producer = session.createProducer(testQueue); 
    Message msg = session.createMessage(); 
    msg.setJMSReplyTo(replyTo); 
    producer.send(msg); 

    System.out.println("Statistics request sent. Waiting to receive reply..."); 

    long receiveTimeout = 5000L; 
    MapMessage reply = (MapMessage) consumer.receive(receiveTimeout); 
    assertNotNull(reply); 

    for (Enumeration e = reply.getMapNames();e.hasMoreElements();) { 
     String name = e.nextElement().toString(); 
     System.out.println(name + "=" + reply.getObject(name)); 
    } 

    connection.close(); 

Ich bekomme Assertionsfehler, weil die "Antwort" null ist.

Irgendwelche Ideen?

+0

Haben Sie StatisticBrokerPlugin in Ihrem Broker installiert? –

+0

Tim: Nein, ich verwende den virtuellen eingebetteten activemq, d. H. Die Broker-URL lautet "vm: // localhost? Broker.persistent = false". Basierend auf der Dokumentation (http://activemq.apache.org/statisticsplugin.html) sollte dies unterstützt werden. – Gul

Antwort

1

Damit dies funktioniert, müssen Sie eine Broker-Instanz erstellen, in der das Statistics Broker-Plug-in installiert ist. Es ist nicht sofort einsatzbereit.

In der XML-Konfiguration können Sie es wie folgt aktivieren:

<broker ...> 
    <plugins> 
    <statisticsBrokerPlugin/> 
    </plugins> 
</broker> 

Oder in einem Unit-Test können Sie eine in VM-Broker etwas ähnlich den folgenden Code erstellen.

protected BrokerService createBroker() throws Exception { 
    BrokerService answer = new BrokerService(); 
    BrokerPlugin[] plugins = new BrokerPlugin[1]; 
    plugins[0] = new StatisticsBrokerPlugin(); 
    answer.setPlugins(plugins); 
    answer.setDeleteAllMessagesOnStartup(true); 
    answer.addConnector("tcp://localhost:0"); 
    answer.start(); 
    return answer; 
} 
0

Ich hatte das gleiche Problem und ich fand die Lösung. Ich konfiguriere den embedded Broker activeMQ mit XML und ich könnte das statisticsBrokerPlugin wie folgt hinzufügen.

<!-- lets create an embedded ActiveMQ Broker --> 
    <amq:broker useJmx="false" persistent="false" enableStatistics="true" brokerName="xxx-test-broker" brokerId="xxx-test"> 
     <amq:transportConnectors> 
      <amq:transportConnector uri="tcp://localhost:0" /> 
     </amq:transportConnectors> 
     **<amq:plugins> 
      <amq:statisticsBrokerPlugin/> 
     </amq:plugins>** 
    </amq:broker> 

So wird meine activeMQ Verbindung URL sein vm: // localhost.

Ich denke, das wird für jemanden nützlich sein.