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的差异。