我正在尝试在我的项目中实现 JMS。我使用 active 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();
Run Code Online (Sandbox Code Playgroud)
此代码有时会返回数据,有时会返回 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());
} …Run Code Online (Sandbox Code Playgroud)