我似乎无法在ActiveMQ(Java版本)中找到监听新的生产者和消费者连接(或连接中断)的方法。我希望能够告诉消费者(或者他们可以发现自己)生产者的连接被丢弃了。另一种方式(生产者发现某个消费者断开连接)也是必需的。
我很感激一些帮助。
答案 0 :(得分:4)
我认为您希望在特定目的地(特定队列或主题)上收听新的制作人和消费者。是吗?
您可以实例化ConsumerEventSource和ProducerEventSource,并通过分别调用它们的setConsumerListener和setProducerListener来注册您自己的侦听器。
所以:
Connection conn = yourconnection; // the connection your listener will use
Destination dest = yourdestination; // the destination you're paying attention to
ConsumerEventSource source = new ConsumerEventSource(conn, dest);
source.setConsumerListener(new ConsumerListener() {
public void onConsumerEvent(ConsumerEvent event) {
if (event.isStarted()) {
System.out.println("a new consumer has started - " + event.getConsumerId());
} else {
System.out.println("a consumer has dropped - " + event.getConsumerId());
}
}
});
如果你看一下ConsumerEventSource或ProducerEventSource的代码,你会发现它们是简单的对象,它们使用AdvisorySupport的方法来监听一个特殊的咨询主题,该主题的业务是广播有关生产者和消费者的新闻。您可以通过阅读这些类的源代码来了解更多信息。
您使用“连接”可能是个问题;在ActiveMQ land(它是JMS land的子集)中,“Connection”是与特定目标无关的低级对象。特定客户端从Connection创建“会话” - 仍然不是特定于目标 - 然后创建特定于目标的QueueSender,QueueReceiver,TopicPublisher或TopicSubscriber。当创建它们时,或者创建它们的会话消失时,那些是您想要听到的事件,并且会听到您是否使用上面的代码。
答案 1 :(得分:2)
我需要的所有信息都发布在ActiveMQ Advisory主题中,例如“ActiveMQ.Advisory.Connection”或简称为“ActiveMQ.Advisory ..>”对于他们所有人。甚至在Stomp Connection中发生的事件也会在ActiveMQ Advisory主题中发布。以下代码给出了一个示例(使用通过Stomp连接的Flex Client进行测试):
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("user", "password", ActiveMQConnection.DEFAULT_BROKER_URL);
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(transacted, ackMode);
connection.start();
Destination destinationAdvisory = session.createTopic("ActiveMQ.Advisory..>");
MessageConsumer consumerAdvisory = session.createConsumer(destinationAdvisory);
consumerAdvisory.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if (message instanceof ActiveMQMessage) {
ActiveMQMessage activeMessage = (ActiveMQMessage) message;
Object command = activeMessage.getDataStructure();
if (command instanceof ConsumerInfo) {
System.out.println("A consumer subscribed to a topic or queue: " + command);
} else if (command instanceof RemoveInfo) {
RemoveInfo removeInfo = (RemoveInfo) command;
if (removeInfo.isConsumerRemove()) {
System.out.println("A consumer unsubscribed from a topic or queue");
}
else {
System.out.println("RemoveInfo, a connection was closed: " + command);
}
} else if (command instanceof ConnectionInfo) {
System.out.println("ConnectionInfo, a new connection was made: " + command);
} else {
System.out.println("Unknown command: " + command);
}
}
}
});