我注意到以下意外行为,可以使用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中配置流程,以便在没有阻塞时返回,或者在找不到名称时抛出异常,即只返回一个空列表?
答案 0 :(得分:2)
许多用户已经要求这样做,我们会对此进行调查。
与此同时,还有一些解决方法。
error-channel
添加到某个上游组件(例如<gateway/>
)以处理异常。request-handler-advice-chain
。将它的returnFailureExpressionResult
属性设置为true,这会导致onFailureExpression
的结果返回到调用线程,而不是抛出异常。答案 1 :(得分:1)
另一个选择是使用service activator
代替jdbcTemplate
。这样,您就可以自己控制响应。
显然,这不是一种理想的方法,但它可以说比使用错误通道或处理程序建议更清晰,因为它应该是正常的响应方案。一个潜在的缺点(虽然我还没有深入研究过这个),你可能会失去jdbc网关框架提供的一些额外的开箱即用的工具(比如额外的JMX
属性/方法曝光等。)