Spring integration Spring集成:聚合器没有将拆分的消息聚合为一条消息 如何在现有弹簧积分流程中间添加下流:

Spring integration Spring集成:聚合器没有将拆分的消息聚合为一条消息 如何在现有弹簧积分流程中间添加下流:,spring-integration,Spring Integration,从emp表查询。它返回例如3行。将这3行插入dept表,然后继续之前运行的流程 拆分器是手动配置来实现的。但是,流在之后不会继续 emp-context.xml ... <int:splitter apply-sequence="false" /> <!-- parent splitter --> ... <jdbc:outbound-gateway query="SELECT * FROM emp" row-mapper="empMapper

从emp表查询。它返回例如3行。将这3行插入dept表,然后继续之前运行的流程

拆分器是手动配置来实现的。但是,流在
之后不会继续

emp-context.xml

...

<int:splitter apply-sequence="false" /> <!-- parent splitter -->

...

<jdbc:outbound-gateway
    query="SELECT * FROM emp"
    row-mapper="empMapper" data-source="myDataSource"
    max-rows-per-poll="100000" />

<int:service-activator ref="myService" method="process" />

<!--     <int:splitter /> child splitter commented out -->

<jdbc:outbound-gateway
    update="INSERT INTO dept (name, dept)
        VALUES(:headers[name], :headers[dept])"
    data-source="myDataSource" />

<int:aggregator />

<!-- flow is not executed after aggregator -->

<jdbc:outbound-gateway
    update="INSERT INTO other_table (mycol)
        VALUES(:headers[mycol])"
    data-source="myDataSource" />

...

我看到了原因的根源


由于您从
MyServiceActivator
列表返回,
AbstractReplyProducingMessageHandler
将其确定为
org.springframework.integration
类别的调试日志级别上的
IterableSwitch,并在此处显示有关该事项的日志。Stacktrace已添加。请注意,另一个_表上的主键冲突即将发生,因为每个拆分的记录都会多次运行flow after。emp-context.xml flow的开头也有一个。因此,从流中删除此子对象后,将聚合父拆分器。我已经用父拆分器更新了我的问题。如果不需要该父拆分器的聚合,可以使用
apply sequence=“false”
切换它。从另一方面看,您似乎还没有跟上我对代码所做的更改。我指的是序列细节的标题。但是,您可以在这里使用有用的方法--
MessageBuilder 35; pushSequenceDetails
在进行更改后,拆分器会按预期工作,但之后流不会继续。我已经更新了问题中的代码和日志。根据您最近的日志,您似乎还没有编译新版本的
MyService
:没有新的
correlation
标题。aggregator只是针对旧值
correlationId
——对新JDBC select.correlationId的每一组记录进行了修改,但我没有在问题中更新它。我不能透露项目的具体细节。因此,根据项目中生成的实际日志手动修改上述日志。我可以在日志中看到sequenceNumber和sequenceSize。另外,请您在回答中将ServiceActivator重命名为MyServiceActivator,就像我在日志中所做的那样。谢谢
public List<Message<String>> process(List<EmpRecord> records, @Headers MessageHeaders headers) {

    List<Message<String>> result = new ArrayList<Message<String>>();

    UUID correlationId = UUID.randomUUID();
    int sequenceNumber = 0;
    int sequenceSize = records.size();

    for (EmpRecord record : records) {

        msg = MessageBuilder
            .withPayload("null")
            .copyHeaders(headers) // headers contains mycol key that I want to preserve to use after aggregator.
            .setHeader("name", record.getName())
            .setHeader("dept", record.getDept())
            .pushSequenceDetails(correlationId, ++sequenceNumber, sequenceSize)
            .build();

        result.add(msg);
    }

    return result;
}
06:43:35.171 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL query
06:43:35.171 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL statement [SELECT * FROM emp]
06:43:35.171 DEBUG [main][org.springframework.integration.jdbc.JdbcOutboundGateway] handler 'org.springframework.integration.handler.MessageHandlerChain#2$child#0.handler' sending reply Message: [Payload=[com.model.EmpRecord@9a18a0, com.model.EmpRecord@c6e1ec, com.model.EmpRecord@11a5fd0, com.model.EmpRecord@8890da]][Headers={mycol=c1}]
06:43:35.171 DEBUG [main][org.springframework.integration.handler.ServiceActivatingHandler] ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@1de007d] received message: [Payload=[com.model.EmpRecord@9a18a0, com.model.EmpRecord@c6e1ec, com.model.EmpRecord@11a5fd0, com.model.EmpRecord@8890da]][Headers={mycol=c1}]
06:43:35.171 INFO  [main][com.service.MyServiceActivator] START :: process
06:43:35.171 INFO  [main][com.service.MyServiceActivator] END :: process
06:43:35.171 DEBUG [main][org.springframework.integration.handler.ServiceActivatingHandler] handler 'ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@1de007d]' sending reply Message: [Payload=null][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.171 DEBUG [main][org.springframework.integration.jdbc.JdbcOutboundGateway] org.springframework.integration.handler.MessageHandlerChain#2$child#3.handler received message: [Payload=null][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.187 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL update
06:43:35.187 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL statement [INSERT INTO dept (name, dept) VALUES(?, ?)]
06:43:35.187 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] SQL update affected 1 rows
06:43:35.187 DEBUG [main][org.springframework.integration.jdbc.JdbcOutboundGateway] handler 'org.springframework.integration.handler.MessageHandlerChain#2$child#3.handler' sending reply Message: [Payload={UPDATED=1}][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.187 DEBUG [main][org.springframework.integration.aggregator.AggregatingMessageHandler] org.springframework.integration.handler.MessageHandlerChain#2$child#4.handler received message: [Payload={UPDATED=1}][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.187 DEBUG [main][org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler] Handling message with correlationKey [cc7b7fc3-8d7e-bf15-240f-9e893ab7f5cc]: [Payload={UPDATED=1}][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.171 DEBUG [main][org.springframework.integration.handler.ServiceActivatingHandler] handler 'ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@1de007d]' sending reply Message: [Payload=null][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.171 DEBUG [main][org.springframework.integration.jdbc.JdbcOutboundGateway] org.springframework.integration.handler.MessageHandlerChain#2$child#3.handler received message: [Payload=null][Headers={name=john, dept=BE, mycol=c1}]
06:43:35.218 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL update
06:43:35.218 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] Executing prepared SQL statement INSERT INTO dept (name, dept) VALUES(?, ?))]
06:43:35.218 DEBUG [main][org.springframework.jdbc.core.JdbcTemplate] SQL update affected 1 rows
06:43:35.218 DEBUG [main][org.springframework.integration.jdbc.JdbcOutboundGateway] handler 'org.springframework.integration.handler.MessageHandlerChain#2$child#3.handler' sending reply Message: [Payload={UPDATED=1}][Headers={name=ravi, dept=SE, mycol=c1}]
06:43:35.218 DEBUG [main][org.springframework.integration.aggregator.AggregatingMessageHandler] org.springframework.integration.handler.MessageHandlerChain#2$child#4.handler received message: [Payload={UPDATED=1}][Headers={name=ravi, dept=SE, mycol=c1}]
06:43:35.218 DEBUG [main][org.springframework.integration.aggregator.AbstractCorrelatingMessageHandler] Handling message with correlationKey [fc91e0bc-87a3-251f-87fd-fc3901285cde]: [Payload={UPDATED=1}][Headers={name=ravi, dept=SE, mycol=c1}]
public List<Message<String>> process(List<EmpRecord> records, @Headers MessageHeaders headers) {

    List<Message<String>> result = new ArrayList<Message<String>>();

    UUID correlationId = UUID.randomUUID();
    int sequenceNumber = 0;
    int sequenceSize = records.size();

    for (EmpRecord record : records) {

        msg = MessageBuilder
            .withPayload("null")
            .copyHeaders(headers) // headers contains mycol key that I want to preserve to use after aggregator.
            .setHeader("name", record.getName())
            .setHeader("dept", record.getDept())

            .setHeader("correlationId", correlationId)
            .setHeader("sequenceNumber", ++sequenceNumber)
            .setHeader("sequenceSize", sequenceSize)
            .build();

        result.add(msg);
    }

    return result;
}