參見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
的List。
您可能還需要考慮使用替代Java DSL
@Bean
public IntegrationFlow flow() {
return f -> f.handle(...)
.handle(...)
.transform(...)
.handle(...);
}
編輯
這不是那麼方便使用POJO服務的Java DSL;你可以直接連線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();
}
}
}
我已經看過XSD的描述,但它仍然似乎不可能配置處理程序鏈只使用註釋。例如,配置服務激活器的註釋是 '@ServiceActivator(inputChannel =「hotDrinkBarista」,outputChannel =「preparedDrinks」) public Drink prepareHotDrink(OrderItem orderItem){...}' 這種配置風格不給我引用了'MessageHandler' bean,所以它不能被添加到鏈中。 雖然DSL配置是一個很好的選擇。 – hummingV
不;你不使用'@ ServiceActivator'。看我的編輯;調用POJO服務並不方便,但可以完成。 DSL是首選。 –
哎呀。非常感謝。 – hummingV