小编vis*_*hva的帖子

即使 activemq 中的队列不为空,JMS 实现中的 receiveNoWait 也会返回 null

我正在尝试在我的项目中实现 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)

activemq-classic jms jakarta-ee

6
推荐指数
1
解决办法
1762
查看次数

标签 统计

activemq-classic ×1

jakarta-ee ×1

jms ×1