Spring integration Spring Boot中的消息处理程序链

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

由于SpringBoot推荐基于Java的配置,所以我很难将以下基于xml的消息处理程序链配置转换为基于Java的配置。感谢您的帮助

<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()
(1
String
参数)的形式需要表达式,而不是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());
    }
})