我正在使用Mule 3.3.1
我正在尝试编写一个从队列中读取所有可用消息的Component,我打算使用Quartz调度程序对其进行轮询。
这是我的代码。
@Override
public Object onCall(MuleEventContext muleEventContext) throws Exception {
MuleMessage[] messages = null;
MuleMessage result = muleEventContext.getMessage();
do {
if (result == null) {
break;
}
if (result instanceof MuleMessageCollection) {
MuleMessageCollection resultsCollection = (MuleMessageCollection) result;
System.out.println("Number of messages: " + resultsCollection.size());
messages = resultsCollection.getMessagesAsArray();
} else {
messages = new MuleMessage[1];
messages[0] = result;
}
result = muleEventContext.getMessage();
} while (result !=null);
return messages;
}
不幸的是,它在第一条消息上无限循环。想法?
答案 0 :(得分:2)
帖子中提供的onCall()方法将无限循环,因为
muleEventContext.getMessage()
始终返回MuleMessage。所以循环将无限进入。
此处的MuleEventContext对象不是迭代器或流,其中指针在读取当前元素后指向下一个元素。
为了从队列中读取所有可用的消息。您可以通过轮询队列并读取所有消息来读取JMS入站。但请记住,队列中的每条消息都是来自JMS入站的一次迭代(一条消息)。
如果要将所有队列消息收集为对象集合然后继续,那么这是一个不同的故事。使用组件代码无法做到这一点。
如果您打算将所有邮件收集为一个集合,然后开始处理,请尝试在您的入站点使用mule的 collection-aggregator 等内容。
希望这有帮助。