Java 查找队列是否包含更多元素
我有以下代码。我试图访问一个队列并消耗资源,我不知道队列中有多少元素,还有多少元素,所以我做了一些事情,但在这种情况下,我无法关闭连接,这会导致错误,稍后,就像进程不会死一样。即使我阻止了它 如何找到队列中是否有更多项目,然后执行以下操作?我看了ActiveMqQueueBrowser,但它是内部的,所以我不能很容易地使用它 你会怎么做?你推荐什么Java 查找队列是否包含更多元素,java,activemq,Java,Activemq,我有以下代码。我试图访问一个队列并消耗资源,我不知道队列中有多少元素,还有多少元素,所以我做了一些事情,但在这种情况下,我无法关闭连接,这会导致错误,稍后,就像进程不会死一样。即使我阻止了它 如何找到队列中是否有更多项目,然后执行以下操作?我看了ActiveMqQueueBrowser,但它是内部的,所以我不能很容易地使用它 你会怎么做?你推荐什么 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ur
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(subject);
MessageConsumer consumer = session.createConsumer(destination);
while(true){
Message message = consumer.receive();
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("message from queue : '" + textMessage.getText() + "'");
}
}
// unreachable code. compiler complains.
// connection.close();
那么,您要等待多长时间才能收到更多消息?除非有任何保证,没有更多的消息可以进来,你不能真正说什么时候完成
如果返回值为空,则可以为接收或调用receiveNoWait和break设置超时,这意味着在给定的时间段内没有可用的消息。听起来您需要另一个线程。你怎么知道什么时候该听呢?如果consumerQueue不再具有值,请尝试以下操作:
while(true){
Message message = consumer.receive(//some int timeout);
if (message == null)
{
break;
}
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("message from queue : '" + textMessage.getText() + "'");
}
}
否则你是对的,循环将永远不会回来,你赢了;当JVM关闭时,您无法正确地关闭连接。您实际上有两个选项来确定ActiveMQ中给定目标上的可用内容。代理公开了JMX的大量信息,因此如果您对此感到满意,可以连接并获取排队的消息数量。另一个不涉及使用JMX的选项是使用代理统计插件。这个插件允许您向代理发送一条消息,并设置ReplyTo目的地,它将用一条包含目的地当前统计信息的消息进行响应。请参阅统计插件的文档