当前位置: 首页 > 知识库问答 >
问题:

SpringIntegration——到底是谁“迭代”了来自拆分器的拆分消息?

金烨华
2023-03-14

关于SI中的拆分器元素,我有几个基本问题。

我知道要形成定制的拆分器逻辑,我们需要扩展AbstractMessageSplitter并覆盖splitMessage方法。

然后,这些拆分消息的集合将显示在拆分器的输出通道上(假设在传入消息上没有配置回复通道)。

分离器的输出通道随后可以成为另一si组件的输入通道。让我们假设该组件是一个简单的服务激活器

手册说集合的“每个”消息将由呈现该集合的下游配置处理。所以在我们的例子中,service-tivator将处理每个消息。

1) 我的查询是“谁”确切地迭代集合,并在ServiceActivator的输入通道上显示集合中的“每条”消息?

2)假设我们这里涉及到所有的直接渠道。现在,如果service-tivator的outout-Channel被配置为nullChannel,那么一旦第一条消息被成功处理,它仍然会显示来自集合的"下一条"消息吗?

3) 我们假设这里没有聚合器。另外,我们假设所有涉及的方法都具有非void返回。将消息“收集”到拆分器的输出通道的调用线程将返回什么?它是否会返回service activator返回的返回类型集合?或者它只会从收集中返回最后处理的消息吗?

我希望我提出的问题足够详细,以便得到澄清。

非常感谢回应。

最好的问候


共有1个答案

刘和玉
2023-03-14

是的。你问的问题很好!

1) AbstractMessageProducingHandler

protected void sendOutputs(Object result, Message<?> requestMessage) {
    if (result instanceof Iterable<?> && shouldSplitOutput((Iterable<?>) result)) {
        for (Object o : (Iterable<?>) result) {
            this.produceOutput(o, requestMessage);
        }
    }
    else if (result != null) {
        this.produceOutput(result, requestMessage);
    }
}

正是从这里,每个项目都被发送到输出通道

2)是的,如果一切都在DirectChannel上,下一条消息直到完成前一条消息才会发送。实际上,它的工作方式与原始java相同:

 for (Object o : collection) {

 }

注意:在此sync情况下,如果当前消息进程失败,则不会发送下一个消息。因为异常。就像原始Java:-)。

3) 嗯。对于原始Java,它可能看起来像:

split(Collection<?>, Future<?>);  
 --->>
 for (Object o : collection) {
     process(Object, Future<?>)
 }

确切地说,这个过程是在拆分器中完成的,或者在每个EIP组件中完成得更好。实际上,它们都只在推送模式下工作。即使对回复做了一些操作,实际上也只是推送到replyChannel

因此,如果您不关心回复过程,那么只有第一条消息将填充该将来的回复

注意,如果您的下游拆分器进程是异步的,例如,执行器通道作为输出通道打开

我认为最后一个问题的答案取决于目标业务逻辑需求。

 类似资料:
  • 这可能是一个基本问题,但是有人能解释一下和之间的主要区别并给出一些例子吗?

  • 使用Spring Integr中的拆分器,我拆分了从数据库中的表中选择的数据行。每条消息完成处理后,我想像旧消息一样将每条消息聚合到一条消息中。我该怎么办?我不知道拆分器拆分了多少条消息。我只知道拆分消息头中的相关ID。即使我聚合消息,我也无法制定发布策略。 我如何解决这个问题? 以及是否有任何方法可以使用jdbc-out站网关或jdbc-out站通道适配器一次插入多行数据,而无需使用拆分器插入每

  • 问题内容: PHP告诉我不建议使用split,我应该使用哪种替代方法? 问题答案: 是另一种选择。但是,如果您打算通过 正则表达式 进行拆分,则可以选择替代方法 。

  • 本文向大家介绍React如何进行代码拆分?拆分的原则是什么?相关面试题,主要包含被问及React如何进行代码拆分?拆分的原则是什么?时的应答技巧和注意事项,需要的朋友参考一下 这里我认为react的拆分前提是代码目录设计规范,模块定义规范,代码设计规范,符合程序设计的一般原则,例如高内聚、低耦合等等。 在我们的react项目中: 1、在 api 层面我们单独封装,对外暴露http请求的结果。 2、

  • 我有以下Flume代理配置来读取来自kafka源的消息并将它们写回HDFS接收器 如果每个轮询周期只有一条kafka消息到达,则kafka消息内容是avro数据,并且正确地序列化为文件。 当两个kafka消息到达同一批次时,它们被分组在同一个HDFS文件上,因为avro消息包含两个模式数据,结果文件包含模式数据模式数据,导致它是无效的. avro文件。 如何拆分avro事件以将不同的kafka消息

  • 下面是WebPack4配置代码: 新的配置代码从项目中使用的节点模块中获取所有代码。但我只希望拆分供应商库(我在enrtry配置部分定义),而不希望拆分node_modules中的所有代码。 在本例中:“babel-polyfill”,“react”,“react-dom”,“jquery”,“bootstrap”