java - 如何使用 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
循环。
解决方案
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();
}
推荐阅读
- javascript - 任何人都可以帮助我使用以下 JavaScript 代码吗?
- java - 通过比较索引找到集合中的最大长度
- javascript - 为什么我无法使用 Google 地图搜索公立学校和私立学校?
- python - 返回所有被视为异常值的行
- html - 如何使这些导航项目居中?
- r - 使用给定模式有效地生成 4 列数字
- android - SourceSets - Groovy -> Kotlin DSL
- mysql - 在 2 个 SQL 表中创建引用的更好方法是什么?
- php - Displaying multiple profile data on a page using PHP and MySQLi
- java - Create Prolog knowledge base in Java using JPL