在查询返回空结果集时,使用jdbc:outbound-gateway时遇到问题

时间:2014-10-11 21:50:42

标签: spring-integration

我注意到以下意外行为,可以使用Spring Integration示例basic / jdbc

重现它

运行Spring Integration示例basic / jdbc并立即尝试查找不存在的名称 即使用Spring Integration示例basic / jdbc运行Main.java,输入1查找人员,输入Mark

抛出ReplyRequiredException,因为找不到行。 如果我在spring-integration-context.xml中更改int-jdbc:outbound-gateway定义以使用requiresReply =" false", 然后调用findPersonByName阻塞,直到int:gateway在配置的5秒后超时。

这是一个非常典型的操作,我想使用Spring Integration jdbc:outbound-gateway返回0个或更多项的列表。 它似乎适用于1或更大的结果大小。 但是,当找到0结果时,两种行为都不合乎需要。我不想要这个例外,因为有时这种行为是预期的,我也不想阻止直到超时。 在Exception的情况下,我可以使用try / catch,但框架在WARN级别记录异常,我不想处理预期的行为,返回0项,异常处理,try / catch。 有没有办法在Spring Integration sample basic / jdbc中配置流程,以便在没有阻塞时返回,或者在找不到名称时抛出异常,即只返回一个空列表?

2 个答案:

答案 0 :(得分:2)

许多用户已经要求这样做,我们会对此进行调查。

与此同时,还有一些解决方法。

  1. error-channel添加到某个上游组件(例如<gateway/>)以处理异常。
  2. ExpressionEvaluatingRequestHandlerAdvice添加到JDBC网关的request-handler-advice-chain。将它的returnFailureExpressionResult属性设置为true,这会导致onFailureExpression的结果返回到调用线程,而不是抛出异常。

答案 1 :(得分:1)

另一个选择是使用service activator代替jdbcTemplate。这样,您就可以自己控制响应。

显然,这不是一种理想的方法,但它可以说比使用错误通道或处理程序建议更清晰,因为它应该是正常的响应方案。一个潜在的缺点(虽然我还没有深入研究过这个),你可能会失去jdbc网关框架提供的一些额外的开箱即用的工具(比如额外的JMX属性/方法曝光等。)

相关问题