Spring integration Spring Boot中的消息处理程序链
由于SpringBoot推荐基于Java的配置,所以我很难将以下基于xml的消息处理程序链配置转换为基于Java的配置。感谢您的帮助Spring integration Spring Boot中的消息处理程序链,spring-integration,Spring Integration,由于SpringBoot推荐基于Java的配置,所以我很难将以下基于xml的消息处理程序链配置转换为基于Java的配置。感谢您的帮助 <chain input-channel="incomingChannel" output-channel="completeChannel"> <splitter ref="itemSplitter" /> <transformer ref="transformer1" /> <transformer ref="tran
<chain input-channel="incomingChannel" output-channel="completeChannel">
<splitter ref="itemSplitter" />
<transformer ref="transformer1" />
<transformer ref="transformer2" />
<aggregator ref="requestProcessor" />
<transformer ref="transformer3" />
<transformer ref="transformer4" />
但是我犯了以下错误
Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: Expression evaluation failed: locateItemEnrichmentTransformer; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'transformer1' cannot be found on object of type 'org.springframework.messaging.support.GenericMessage' - maybe not public?
因此,我不确定这是否是Java代码中转换原始链xml配置的等效方法
RequestProcessor(聚合器)实现:
@Component
public class RequestProcessor {
/** The log. */
private static Log log = LogFactory.getLog(RequestProcessor.class);
@Aggregator
public Message<Requests> aggregate(@Headers Map<String, ?> headers, List<Request> requests) {
try {
return MessageBuilder.withPayload(new Requests(service.submit(requests, false, true)))
.copyHeaders(headers)
.build();
} catch (ClientException e) {
log.error(e.toString());
return null;
}
}
}
@组件
公共类请求处理器{
/**日志*/
私有静态日志Log=LogFactory.getLog(RequestProcessor.class);
@聚合器
公共消息聚合(@Headers映射头,列表请求){
试一试{
return MessageBuilder.withPayload(新请求(service.submit(请求,false,true)))
.CopyHeader(标题)
.build();
}捕获(客户例外e){
log.error(例如toString());
返回null;
}
}
}
没有义务将流从XML转换为Java-您可以使用@ImportResource
拉入XML
在java中连接MessageHandlerChain
当然是可能的,但是正如您所发现的,使用JavaDSL来替换一个链更容易
.transform()
(1String
参数)的形式需要表达式,而不是bean名称
你可以用
.transform(transformer1())
其中transformer1()
是您的转换器@Bean
编辑
对于聚合器,如果您使用的是Java 8
.aggregate(a -> a.processor(requestProcessor()))
…对于Java 7或6
.aggregate(new Consumer<AggregatorSpec>() {
public void accept(AggregatorSpec a) {
a.processor(requestProcessor());
}
})
.aggregate(新消费者(){
公共无效接受(聚合器规范a){
a、 处理器(requestProcessor());
}
})
错误是什么,您尝试过什么?但我使用的自定义转换器无法实现GenericTransformer接口-这是.transform(…)所要求的。它不必是GenericTransformer
;它可以是任何POJO@Bean
<代码>公共B转换(对象服务),只要它有明确的方法;否则,您可以添加方法名称-这与XML相同。谢谢Gary,但我在我的IntegrationFlows类中没有看到transform(对象服务)。顺便问一下,我可以使用IntegrationFlows.handle(beanName,method)而不是transform,聚合来处理消息处理吗?>但我没有看到…
-您必须使用旧版本;在1.1.0中增加;当前版本为1.1.2。我不明白你的第二个问题;如果你的链有一个聚合器,你需要一个DSL中的聚合器;除非你想打造自己的聚合器。我需要查看您的requestProcessor
的实现,以建议如何连接它。如果它有@releasetrantegy
etc注释,您可以使用.aggregate(requestProcessor(),null)
。如果是MessageGroupProcessor
,则可以使用.aggregate(requestProcessor())
。
.aggregate(a -> a.processor(requestProcessor()))
.aggregate(new Consumer<AggregatorSpec>() {
public void accept(AggregatorSpec a) {
a.processor(requestProcessor());
}
})