Mule 用于从队列读取消息的自定义组件

Mule 用于从队列读取消息的自定义组件,mule,message-queue,mule-component,Mule,Message Queue,Mule Component,我用的是骡子3.3.1 我正在尝试编写一个组件来读取队列中的所有可用消息,我打算使用Quartz调度程序对其进行轮询 这是我的密码 @Override public Object onCall(MuleEventContext muleEventContext) throws Exception { MuleMessage[] messages = null; MuleMessage result = muleEventContext.getMessage();

我用的是骡子3.3.1

我正在尝试编写一个组件来读取队列中的所有可用消息,我打算使用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;
}
不幸的是,它在第一条消息上无限循环。想法?

文章中提供的onCall()方法将无限循环,因为

muleEventContext.getMessage()
总是返回多个消息。因此,循环将无限延伸

这里的MuleEventContext对象不是迭代器或流,指针在读取当前元素后指向下一个元素

以便从队列中读取所有可访问的消息。您可以通过轮询队列并读取所有消息来读取JMS入站。但是请记住,队列上的每条消息都是来自JMS入站的一次迭代(一条消息)

如果要将所有队列消息收集为对象的集合,然后继续,那么情况就不同了。这不能用组件代码完成

如果您打算将所有消息收集为一个集合,然后开始处理,那么请尝试在入站时使用mule的集合聚合器


希望这能有所帮助。

您不需要将结果设置为null,所以它会一直保持不变looping@Learner很抱歉我的要求是循环遍历队列上的所有消息。你知道我该如何实现吗?请在调用此组件和队列入站的位置添加配置。Mule 3.5具有更好的批处理功能,你尝试过吗?谢谢。是否有任何groovy脚本可以实现聚合?我正试图找到一个简单要求的答案。。。但还没有找到解决办法。