2016-04-11 18 views
1

埋め込みActiveMQから自分のJUnitテストを通してトピックのサブスクリプション統計を取得しようとしています。私はそのトピックを購読することができ、そのトピックにメッセージを送り、そのメッセージをリスナー/サブスクライバで受け取ることができます。埋め込みActiveMQ統計メッセージを受信できません

ただし、そのActiveMQから統計情報を取得しようとすると、コンシューマはタイムアウトになります。消費者がメッセージを無期限に待つよりも、「receiveTimeout」を追加しないと統計情報のコードは次のとおりです。

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

「返信」がnullのため、アサーションエラーが発生します。

アイデア?

+0

ブローカにStatisticBrokerPluginがインストールされていますか? –

+0

Tim:いいえ、私は仮想組み込みactivemqを使用しています。つまり、ブローカーURLは "vm:// localhost?broker.persistent = false"です。ドキュメント(http://activemq.apache.org/statisticsplugin.html)に基づいて、これはサポートされるべきです。 – Gul

答えて

1

これを実行するには、Statistics BrokerプラグインがインストールされているBrokerインスタンスを作成する必要があります。これはそのままでは使用できません。

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

するか、ユニットテストでは、次のコードに似たものを使用してVMのブローカーに作成することがあります:XML構成で

次のようにあなたはそれを有効にすることができます。

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

私は同じ問題を抱えていました。解決策が見つかりました。私はXMLを使用してactiveMQ埋め込みブローカーを設定しており、次のようにstatisticsBrokerPluginを追加できます。

<!-- 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> 

だから私のActiveMQの接続URLは、VMになります:// localhostを。

これは誰かにとって便利だと思います。

関連する問題