Spring integration 设计: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]"

在项目中使用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]"
    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
。为了克服这个输入错误问题,您可以使用POJO
payload
和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"/>