2016-02-26 4 views
1

Я добавил WireTap конфигурации моей интеграции с Spring.Конфигурация WireTap в Spring интеграции Java DSL

Я рассмотрел обсуждение 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"/> 

Как можно Я настраиваю wireTaps в Java DSL менее подробный и простой?

ответ

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 для целевого класса, если мы хотим, чтобы он был как компонент.

С другой стороны Java DSL имеет .wireTap() EIP-метод. Таким образом, вам не нужно объявлять все эти компоненты. Например. от наших тестовых случаев:

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

Как вы видите, у нас нет каких-либо дополнительных @Bean там и даже нам не нужен дополнительный канал для WireTap.

Сообщите мне, как проще простого бы вы его увидеть!

Смежные вопросы