1

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

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

4

1 回答 1

2

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

muleEventContext.getMessage()

总是返回一个 MuleMessage。所以循环将无限进入。

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

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

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

如果您打算将所有消息收集为一个集合,然后开始处理,请尝试 在您的入站使用类似集合聚合器之类的东西。

希望这可以帮助。

于 2013-09-09T18:30:20.410 回答