2016-02-26 169 views
1

我已将WireTap配置添加到我的Spring集成Java DSL中。Spring集成Java DSL中的WireTap配置

我回顾讨论What is the equivalent of logging-channel-adapter in java DSL现在我主要的Java配置文件看起来像

@Configuration 
@Import(LoggerConfiguration.class) 
@EnableIntegration 
public class ProcessorConfiguration { 

    @Autowired 
    private WireTap wireTap; 

    @Bean 
    public QueueChannel inputChannel() { 
     return MessageChannels.queue(500) 
      .interceptor(wireTap) 
      .get(); 
    } 

    @Bean 
    public PublishSubscribeChannel outputChannel() { 
     return MessageChannels.publishSubscribe() 
      .interceptor(wireTap) 
      .get(); 
    } 
    ... 
} 

而且LoggerConfiguration

@Configuration 
public class LoggerConfiguration { 

    public static final LoggingHandler.Level INFO = LoggingHandler.Level.INFO; 

    @Bean 
    public WireTap wireTap() { 
     return new WireTap(loggerChannel()); 
    } 

    @Bean 
    public IntegrationFlow loggerChain() { 
     return IntegrationFlows.from(loggerChannel()) 
       .handle(loggerHandler()) 
       .get(); 
    } 

    @Bean 
    public MessageChannel loggerChannel() { 
     return MessageChannels.direct().get(); 
    } 

    public MessageHandler loggerHandler() { 
     LoggingHandler loggingHandler = new LoggingHandler(INFO.name()); 
     ... 
     return loggingHandler; 
    } 
} 

的THES色调所有(!)的代码只有达到我曾在这些简单的行中的XML配置

<int:channel id="inputChannel"> 
    <int:queue capacity="500"/> 
    <int:interceptors> 
     <int:wire-tap channel="logger"/> 
    </int:interceptors> 
</int:channel> 

<int:publish-subscribe-channel id="outputChannel"> 
    <int:interceptors> 
     <int:wire-tap channel="logger"/> 
    </int:interceptors> 
</int:publish-subscribe-channel> 

<int:logging-channel-adapter id="logger" log-full-message="true" level="INFO"/> 

怎么可以我在Java DSL中配置wireTaps不那么冗长和简单?

回答

1

既然你真的没有有没有flow你可以结束与:

@ServiceActivator(inputChannel = "loggerChannel") 
public MessageHandler loggerHandler() { 
    LoggingHandler loggingHandler = new LoggingHandler(INFO.name()); 
    ... 
    return loggingHandler; 
} 

没有理由申报了“详细” IntegrationFlow如果只有简单的handle逻辑。

Java DSL确实可以与原始Java &注释配置相结合,甚至XML配置也可以在那里生存。

WireTap可以不被声明为@Bean

@Bean 
public PublishSubscribeChannel outputChannel() { 
    return MessageChannels.publishSubscribe() 
     .interceptor(new WireTap(loggerChannel())) 
     .get(); 
} 

XML定义经由分析器逻辑声明了<int:wire-tap>豆。

对于Java配置,我们没有太多的选择,除非目标类为@Bean,如果我们想将它作为一个bean。

另一方面,Java DSL有.wireTap() EIP方法。所以,你不需要声明所有这些bean。例如。从我们的测试情况:

@Bean 
public IntegrationFlow wireTapFlow5() { 
    return f -> f 
      .wireTap(sf -> sf 
        .<String, String>transform(String::toUpperCase) 
        .channel(c -> c.queue("wireTapSubflowResult"))) 
      .channel("nullChannel"); 
} 

正如你看到的,我们没有任何额外的@Bean那里,甚至我们不需要为WireTap额外的通道。

让我知道更简单,你想看看它!