2017-08-27 22 views
1
一個支持命名空間

xml配置允許處理程序鏈標籤內處理程序的嵌套象下面這樣:是否可以僅使用java批註來配置彈簧集成'MessageHandlerChain'?

<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

參見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(); 
     } 

    } 

} 
+0

我已經看過XSD的描述,但它仍然似乎不可能配置處理程序鏈只使用註釋。例如,配置服務激活器的註釋是 '@ServiceActivator(inputChannel =「hotDrinkBarista」,outputChannel =「preparedDrinks」) public Drink prepareHotDrink(OrderItem orderItem){...}' 這種配置風格不給我引用了'MessageHandler' bean,所以它不能被添加到鏈中。 雖然DSL配置是一個很好的選擇。 – hummingV

+0

不;你不使用'@ ServiceActivator'。看我的編輯;調用POJO服務並不方便,但可以完成。 DSL是首選。 –

+0

哎呀。非常感謝。 – hummingV