博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java no wait_即使队列在activemq中不为空,JMS实现中的receiveNoWait也返回null
阅读量:4568 次
发布时间:2019-06-08

本文共 2064 字,大约阅读时间需要 6 分钟。

我正在尝试在我的项目中实现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 retrieveObjectFromQueue(Queue queue, Class 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

谢谢

转载地址:http://rkyms.baihongyu.com/

你可能感兴趣的文章
Spring Boot + Spring Cloud 构建微服务系统(九):配置中心(Spring Cloud Config)
查看>>
【转】LINQ to SQL语句(1)之Where
查看>>
《基于MVC的javascript web富应用开发》中的一些函数
查看>>
0014---简单的计算
查看>>
自己写的文字轮播(简陋版)
查看>>
TWaver在FTTX设备网管系统中的应用
查看>>
python入门笔记1
查看>>
Word打不开老提示进入“安全模式”怎么办
查看>>
HTTP协议分析及攻防方法
查看>>
编程我们学到了什么?
查看>>
面向过程和面向对象的对比(转)
查看>>
206. 反转链表
查看>>
622. 设计循环队列
查看>>
MCMC 、抽样算法与软件实现
查看>>
Java开源工具 网站开发工具清单
查看>>
POJ 1442 Black Box
查看>>
Python 内置模块:os模块
查看>>
C# 中的特性 Attribute
查看>>
Microsoft SQL Server, Error: 15128 ()
查看>>
学《数据结构》有感
查看>>