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

时间:2013-09-09 14:48:56

标签: mule message-queue mule-component

我正在使用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;
}

不幸的是,它在第​​一条消息上无限循环。想法?

1 个答案:

答案 0 :(得分:2)

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

muleEventContext.getMessage()

始终返回MuleMessage。所以循环将无限进入。

此处的MuleEventContext对象不是迭代器或流,其中指针在读取当前元素后指向下一个元素。

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

如果要将所有队列消息收集为对象集合然后继续,那么这是一个不同的故事。使用组件代码无法做到这一点。

如果您打算将所有邮件收集为一个集合,然后开始处理,请尝试在您的入站点使用mule的 collection-aggregator 等内容。

希望这有帮助。