首页 > 解决方案 > 如何使用 Apache Camel 从 Java 类访问 JMS 队列?

问题描述

我有一个 Apache Camel 中间件来在两个系统之间同步实体。如果实体到达目的地时发生错误,我会在 JMS 队列中存储一条消息,其中包含有关该错误的信息。

我们在 Camel 内部还有一个 API 可以“查询”该队列。所述 API 的 GET 方法之一应将所有消息放入错误队列中,并为队列中的每条消息使用 EntityId + 错误消息形成响应。

我知道我可以使用这样的方式从队列中消费(我正在使用 Spring Boot):

@Autowired
private ConsumerTemplate consumTemplate;

然后receive从那里打电话ConsumerTemplate,但这似乎不是一种非常合适的方式,因为我怎么知道什么时候没有更多消息?我可以等待null,但我只是想知道是否有更优雅的方式来做到这一点。

所以我的问题是:有什么方法可以将队列中的所有消息都放入一个List或类似的东西中,而不是一个一个地消耗它们?而且我还不需要“消费”它们,而是浏览它们,因此所有消息都保留在队列中以供进一步处理。

我尝试过这样的事情:

@Autowired
private JmsComponent jms;

public void getAllErrorGroups() throws Exception {
    javax.jms.Session jmsSession = jms.getConnectionFactory().createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);
    QueueBrowser browser = jmsSession.createBrowser(jmsSession.createQueue(ApplicationConstants.Routes.ERROR _QUEUE_ROUTE));        
    Enumeration<?> enumeration = browser.getEnumeration();
}

但我什么都没穿enumeration。我在调试器中查看了它,也做了 awhile(enumeration.hasNext())并且它从未进入while循环。

标签: javaspring-bootapache-cameljms

解决方案


JMS API 不支持一次接收多个消息的功能,因此您必须逐个处理。此外,我不知道有什么比receive(long)使用 timeout 调用和 getting更优雅的方法来确定队列为空null

至于你的浏览器,我相信你没有得到任何东西,因为你没有调用start()你的 JMS 连接。尝试这样的事情:

@Autowired
private JmsComponent jms;

public void getAllErrorGroups() throws Exception {
   javax.jms.Connection jmsConnection = jms.getConnectionFactory().createConnection();
   javax.jms.Session jmsSession = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
   jmsConnection.start();

   QueueBrowser browser = jmsSession.createBrowser(jmsSession.createQueue(ApplicationConstants.Routes.ERROR _QUEUE_ROUTE));
    
   Enumeration<?> enumeration = browser.getEnumeration();
}

推荐阅读