具有命名空间支持的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)中显示任何注释配置示例。所以,我想知道它是否可能,或者如果是,请给我看一个示例配置。
答案 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();
}
}
}