是否可以仅使用java注释配置spring集成'MessageHandlerChain'?

时间:2017-08-27 23:41:13

标签: spring-integration

具有命名空间支持的Xml配置允许在处理程序链标记内嵌套处理程序,如下所示:

<int:chain input-channel="input">
    <int-xml:marshalling-transformer marshaller="marshaller" result-type="StringResult" />
    <int:service-activator ref="someService" method="someMethod"/>
    <int:header-enricher>
        <int:header name="foo" value="bar"/>
    </int:header-enricher>
    <int:logging-channel-adapter level="INFO" log-full-message="true"/>
</int:chain>

但我不知道如何在基于注释的配置中实现这一点。 Spring集成参考文档未在MessageHandlerChain部分(https://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html#chain)中显示任何注释配置示例。所以,我想知道它是否可能,或者如果是,请给我看一个示例配置。

1 个答案:

答案 0 :(得分:1)

请参阅Programming Tips and Tricks

  

如果您已熟悉Spring Integration XML配置,从版本4.3开始,我们在XSD元素定义中提供了指针的描述,其中目标类用于为适配器或网关生成bean。

在这种情况下:

<xsd:annotation>
    <xsd:documentation>
        Defines a Consumer Endpoint for the 'org.springframework.integration.handler.MessageHandlerChain'
        composed of a chain of Message Handlers.
    </xsd:documentation>
</xsd:annotation>

MessageHandlerChain @Bean获取MessageHandler s的列表。

您可能还想考虑使用Java DSL代替

@Bean
public IntegrationFlow flow() {
    return f -> f.handle(...)
         .handle(...)
         .transform(...)
         .handle(...);
}

修改

将Java DSL用于POJO服务并不方便;您可以直接连接到真实的MessageHandler,但对于POJO服务,每个服务器需要两个@Bean。这是一个例子......

@SpringBootApplication
public class So45910254Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(So45910254Application.class, args);
        context.getBean("input", MessageChannel.class).send(new GenericMessage<>("bar"));
        context.close();
    }

    @ServiceActivator(inputChannel = "input")
    @Bean
    public MessageHandler chain() {
        MessageHandlerChain chain = new MessageHandlerChain();
        chain.setHandlers(Arrays.asList(myPOJOMessageHandler(), logger()));
        return chain;
    }

    @Bean
    public MessageHandler myPOJOMessageHandler() {
        return new ServiceActivatingHandler(processor());
    }

    @Bean
    public MethodInvokingMessageProcessor<?> processor() {
        return new MethodInvokingMessageProcessor<>(foo(), "upCase");
    }

    @Bean
    public Foo foo() {
        return new Foo();
    }

    @Bean
    public LoggingHandler logger() {
        return new LoggingHandler(Level.INFO);
    }

    public static class Foo {

        public String upCase(String in) {
            return in.toUpperCase();
        }

    }

}