Spring integration 设计:Spring集成jdbc最佳实践
在项目中使用Spring集成后,我的观察是仅在流的开始或结束时使用jdbc适配器或网关。如果我们在流中间使用它们,那么它会变得过于冗长和复杂。 例如:Spring integration 设计:Spring集成jdbc最佳实践,spring-integration,Spring Integration,在项目中使用Spring集成后,我的观察是仅在流的开始或结束时使用jdbc适配器或网关。如果我们在流中间使用它们,那么它会变得过于冗长和复杂。 例如: <jdbc:outbound-gateway query="select * from foo where c1=:headers[c1] AND c2=:headers[c2] AND c3=:headers[c3] AND c4=:headers[c4]"
<jdbc:outbound-gateway
query="select * from foo where
c1=:headers[c1] AND
c2=:headers[c2] AND
c3=:headers[c3] AND
c4=:headers[c4]"
row-mapper="fooMapper" data-source="myDataSource" max-rows-per-poll="100000" />
<int:service-activator ref="serviceActivator" method="processFoo" />
如果对这个概念的理解有缺陷,请纠正我
我们需要在java代码和xml文件中来回查看where条件或where子句过多时的任何更改
甚至对于JDBC周围的原始Java代码也是如此:如果更改模型,当然应该更改SELECT
,因为它只是一个字符串。这就是为什么需要做大量工作来确保它的类型安全——ORM、QueryDSL、Spring数据等等
如果我们将:headers[c1]拼错为:headers[d1],那么它不会引发任何异常并将:headers[d1]替换为null
这是因为标题
只是一个映射
,如果映射中没有这样一个键
,则会得到null
。为了克服这个输入错误问题,您可以使用POJOpayload
和getter,或者一些自定义头,然后再次使用POJO和getter。在这种情况下,您将得到一个例外,即对象没有这样的属性。尽管您只会在运行时看到这个问题,而不会在编译时看到。同样地,哈希表
——仅在运行时也是如此
因此,我们必须使用requires reply=“false”来更改默认行为
您应该在设计时理解它:允许或不为组件返回任何内容
最后一个主意很好。您是否介意分享您的NullReplyAdvice
?
实际上,我在JDBC网关前面的
中也实现了同样的功能:通过count(*)
query来确定是否有要获取的内容。当SELECT
返回行时,我可以从这里将流引导到不同的逻辑,而不是直接流
更新
当您希望使用模型对象在消息中保留特定于业务的值时,只需将此对象放在标题中即可:
public class Foo {
private String foo1;
private String foo2;
public String getFoo1() {
return foo1;
}
public String getFoo2() {
return foo2;
}
}
...
MessageBuilder.withPayload(payload).setHeader("foo", foo).build();
...
<jdbc:outbound-gateway
query="select * from foo where
c1=:headers[foo].foo1 AND
c1=:headers[foo].foo2"/>
公共类Foo{
私有字符串foo1;
私有字符串foo2;
公共字符串getFoo1(){
返回foo1;
}
公共字符串getFoo2(){
返回foo2;
}
}
...
MessageBuilder.withPayload(payload).setHeader(“foo”,foo).build();
...
对于NullReplyAdvice实现,请检查我的项目有太多的查询,并且现在变得太冗长。我必须在每次查询后使用NullReplyAdvice来处理空结果。能否请您与getter共享POJO有效负载的代码。我试试看。谢谢。添加了POJO头示例在上面的POJO头示例中,如何基于[foo].foo1的值进行路由。例如,类似这样的内容:不,只需按提供的名称提取标题。出于嵌套目的,您应该将通用路由器与expression=“headers[foo].foo1”
一起使用。注意:
指示器仅用于JdbcTemplate
public class Foo {
private String foo1;
private String foo2;
public String getFoo1() {
return foo1;
}
public String getFoo2() {
return foo2;
}
}
...
MessageBuilder.withPayload(payload).setHeader("foo", foo).build();
...
<jdbc:outbound-gateway
query="select * from foo where
c1=:headers[foo].foo1 AND
c1=:headers[foo].foo2"/>