【发布时间】:2016-05-27 03:23:38
【问题描述】:
我正在尝试在我的项目中实现 JMS。我使用活动 mq 作为提供者,并使用持久队列。 以下是从活动 mq 中检索元素的代码
conn = GlobalConfiguration.getJMSConnectionFactory().createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(queue);
ObjectMessage obj = (ObjectMessage) consumer.receiveNoWait();
此代码有时会返回数据,有时会返回 null,即使我可以在活动的 mq 管理控制台中看到未决消息的数量为非零。 我读了一堆文章,很少有人提到 JMS api 并不要求你每次都获取元素,你必须相应地编码。 由于在我的场景中,我依赖于队列,一旦队列返回null,我就会终止进程,所以我按以下方式修改了代码
我没有调用receiveNoWait,而是在通过队列浏览器检查队列中是否存在元素后开始使用receive。以下是修改后的代码
public static <T> T retrieveObjectFromQueue(Queue queue, Class<T> clazz) {
synchronized (queue) {
if(!queueHasMoreElements(queue))
return null;
Connection conn = null;
Session session = null;
try {
conn = GlobalConfiguration.getJMSConnectionFactory().createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(queue);
ObjectMessage obj = (ObjectMessage) consumer.receive();
return clazz.cast(obj.getObject());
} catch(Exception e) {
throw new RuntimeException(e);
}finally {
closeSessionAndConnection(session, conn);
}
}
public static boolean queueHasMoreElements(Queue queue) {
Connection conn = null;
Session session = null;
try {
conn = GlobalConfiguration.getJMSConnectionFactory().createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
QueueBrowser browser = session.createBrowser(queue);
Enumeration enumeration = browser.getEnumeration();
return enumeration.hasMoreElements();
} catch(Exception e) {
throw new RuntimeException(e);
}finally {
closeSessionAndConnection(session, conn);
}
现在我的代码在处理了大约 20-30 个元素后卡住了,我再次可以在管理控制台中看到待处理的元素。 当我尝试使用调试模式时,我意识到,在检索 20-30 个元素后,我的代码卡在 consumer.receive() 上,如果队列为空,这是预期的,但是当我检查我的管理控制台,它显示了队列中的很多元素。
我使用 jdbc(mysql) 作为 activemq 的持久存储。我使用的配置xml在activemq配置示例中给出(activemq/examples/conf/activemq-jdbc-performance.xml)
我使用 tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1 作为 activemq url。
请让我知道我做错了什么。我正在使用 java8 和 apache activeMq 5.13.1
谢谢
【问题讨论】:
标签: jakarta-ee jms activemq