Java DSL理解

Spring Integration中引入了Java DSL,希望可以让开发人员不再完全依赖xml进行配置,而是可以通过Java代码进行集成流程的配置,并且通过java 编译器尽早发现问题。
的确,通过xml进行配置,小项目还可以,大项目估计很容易把人给绕晕。但是Java DSL其实也有类似的问题。小项目写写还是很清楚的,项目一大,看DSL如同看天书。
接下来,我们结合两个例子来体验一下Java DSL的用法。

    @Bean
    public IntegrationFlow Flow1() {
        return IntegrationFlows.from("resultChannel")
                .log(LoggingHandler.Level.INFO, "full list of records", m -> m.getPayload())
                .get();
    }
    @Bean
    public IntegrationFlow Flow2() {
        return f -> f
                .handle(Jpa.retrievingGateway(this.entityManagerFactory)
                        .jpaQuery("from Person p where p.id =:id")
                        .expectSingleResult(true).parameterExpression("id", "payload")
                        )
                .log(LoggingHandler.Level.INFO, "query with where condition", m -> m.getPayload());
    }

上面2例中,Flow1和Flow2都是IntegrationFlow,但是返回值的写法不同。

Flow1采用的是标准写法,从定义输入Channel开始;

Flow2是衍生写法,看似没有定义输入Channel,其实它默认自己就是输入Channel,Channel的名称为Flow2.input。也就是在自己的方法名后,追加“.input”组合成Channel名称。这个在文档里是提到了的。在Flow2方法体中的f,其类型就是MessageChannel.

从原理上来说,DSL通过串接方式,将一条消息的完整处理路径给定义出来。所以dsl中主要是配置处理过程。处理过程之间会通过channel进行串接。串接用的channel不需要特别声明,dsl自动配置。

一些标准的操作,可以用transformer,splitter,一些非标的操作,也可以使用专用处理函数,这个称为handle.在xml里称为service activator.

si是否一定要用kafka adapter呢?其实也未必。完全可以将kafka通讯包装成handle,然后进行处理。

用kafka adapter,有一定的学习成本。如果后续调试的话,也不是很方便,是一个黑盒。学会了si,开发时能否快捷一些?这个需要对比spring kafka和spring integration kafka adapter的差异。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。