【问题标题】:WireTap configuration in Spring Integration Java DSLSpring Integration Java DSL 中的 WireTap 配置
【发布时间】:2016-06-10 08:40:13
【问题描述】:

我已将 WireTap 配置添加到我的 Spring Integration 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;
   }
}

代码的所有音调(!)仅用于在这些简单的行中达到我在 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 不那么冗长和简单?

【问题讨论】:

    标签: java spring spring-integration


    【解决方案1】:

    由于您确实没有flow,因此您最终只能得到:

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

    如果只有简单的handle 逻辑,就没有理由声明“冗长”IntegrationFlow

    Java DSL 真的可以与原始的 Java 和注释配置相结合,甚至 XML 配置也可以在那里。

    WireTap 不能声明为@Bean

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

    XML 定义通过 Parser 逻辑为 &lt;int:wire-tap&gt; 声明 bean。

    对于 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 的额外频道。

    让我知道您希望看到它有多简单!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多