我有以下代码。我试图访问队列并消耗资源,我不知道队列中有多少元素和剩余多少元素,所以我正在做while(true)
但是在这种情况下,我无法关闭导致错误的连接,稍后,就像过程不会死。即使我停止了它。
如何查找队列中是否有更多项目,然后执行以下操作?我看了一下ActiveMqQueueBrowser,但它是内部的,所以我不能轻易地使用它。
你会做什么?你推荐什么? 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();
答案 0 :(得分:0)
您希望等待更多邮件到达多长时间?除非能保证不再有任何消息可以进入,否则你无法真正说出它何时“完成”。
您可以向receive()
发出超时或致电receiveNoWait()
,如果返回值为null
则中断,这意味着在给定时间段内没有可用消息。
答案 1 :(得分:0)
听起来你需要另一个线程。你怎么知道什么时候听?如果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关闭时,能够正确关闭连接。
答案 2 :(得分:0)
您实际上有几个选项可用于确定ActiveMQ中给定目标上的可用内容。该代理公开了JMX的大量信息,因此如果您对此感到满意,您可以连接并获取入队的消息数量。不涉及使用JMX的另一个选项是使用Broker Statistics插件。此插件允许您使用ReplyTo目标集向代理发送消息,并且它将使用包含Destination的当前统计信息的消息进行响应。请参阅统计信息插件here的文档。