【问题标题】:Custom component to read messages from queue从队列中读取消息的自定义组件
【发布时间】:2013-09-13 02:30:16
【问题描述】:

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

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

【问题讨论】:

  • 你无法将结果设置为空,所以它会继续循环
  • @Learner 对不起。我的要求是遍历队列中的所有消息。知道如何实现吗?
  • 请在调用该组件的位置和入站队列中添加您的配置。
  • Mule 3.5 有更好的批处理,你试过吗?

标签: mule message-queue mule-component


【解决方案1】:

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

muleEventContext.getMessage()

总是返回一个 MuleMessage。所以循环会无限循环下去。

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

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

如果您想将所有 Queue 消息收集为一个对象集合然后继续,那么情况就不同了。使用您的组件代码无法做到这一点。

如果您打算将所有消息收集为一个集合,然后开始处理,请尝试在入站时使用类似 collection-aggregator 的骡子。

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 2021-03-11
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 2022-01-04
  • 2010-09-19
  • 2014-02-24
相关资源
最近更新 更多