Spring integration Spring集成:聚合器没有将拆分的消息聚合为一条消息 如何在现有弹簧积分流程中间添加下流:
从emp表查询。它返回例如3行。将这3行插入dept表,然后继续之前运行的流程 拆分器是手动配置来实现的。但是,流在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-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;
}