【问题标题】:Spring Integration JPA Gateway: act on empty resultSpring Integration JPA Gateway:对空结果采取行动
【发布时间】:2020-12-02 08:59:02
【问题描述】:

我的流程中有以下句柄:

.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
                    .entityClass(DocumentHeader.class)
                    .jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
                    .parameterExpression("modified", "payload")
                    .maxResults(maxResults), e -> e.id("retrieveDocumentHeader"))
            .channel(Channels.DOCUMENT_HEADER.name())

如果 jpa 查询没有返回结果,我想做点什么。我需要为此实施建议吗?如果是,如何获取查询返回空结果的信息?

更新

根据 Artem 的建议,我提出了以下建议:

    @Bean
public Advice returnEmptyResultForAdvice() {
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setOnFailureExpressionString("new java.util.ArrayList(0)");
    advice.setReturnFailureExpressionResult(true);
    return advice;
}

还有网关:

.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
                    .entityClass(DocumentHeader.class)
                    .jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
                    .parameterExpression("modified", "payload")
                    .maxResults(maxResults), e -> e.id("retrieveDocumentHeader")
                    .advice(this.advices.returnEmptyResultForAdvice()).requiresReply(true))

但它给了我以下错误:

2020-08-13 19:13:57.474 ERROR 5552 --- [ask-scheduler-1] o.s.integration.handler.LoggingHandler   : org.springframework.integration.handler.ReplyRequiredException: No reply produced by handler 'retrieveDocumentHeader', and its 'requiresReply' property is set to true....]

更新2

我对ExpressionEvaluatingRequestHandlerAdvice做了一些调试

protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) {
    try {
        Object result = callback.execute();
        if (this.onSuccessExpression != null) {
            this.evaluateSuccessExpression(message);
        }

        return result;
    } catch (RuntimeException var7) {
        Exception actualException = this.unwrapExceptionIfNecessary(var7);
        if (this.onFailureExpression != null) {
            Object evalResult = this.evaluateFailureExpression(message, actualException);

它从不抛出异常,所以我猜这就是不调用失败表达式的原因?

【问题讨论】:

    标签: spring spring-integration spring-integration-dsl


    【解决方案1】:

    示例建议:

    @Bean
    public Advice verifyEmptyResult() {
        return new AbstractRequestHandlerAdvice() {
            @Override
            protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) {
                Object executed = callback.execute();
                if (executed == null)
                    return new ArrayList<>();
                else
                    return executed;
            }
        };
    }
    

    【讨论】:

      【解决方案2】:

      此功能尚未实现:https://jira.spring.io/browse/INT-3333

      但是,当您将此建议添加到 e(端点配置器)及其 requiresReply(true) 选项中时,您可以使用 ExpressionEvaluatingRequestHandlerAdviceReplyRequiredException

      那么ExpressionEvaluatingRequestHandlerAdvice 可能有一个onFailureExpressionreturnFailureExpressionResult 以返回例如一个空列表。

      更新

      我收回我的ExpressionEvaluatingRequestHandlerAdvice 建议。 我们有这样的代码:

      Object result = callback.execute();
      if (this.onSuccessExpression != null) {
          evaluateSuccessExpression(message);
      }
      return result;
      

      callback.execute() 为我们返回 null,我们不在乎,直接返回。 ReplyRequiredException 稍后抛出。所以,这个确实符合我们null reply 的要求。

      我建议您通过检查callback.execute() 的结果来实现自己的AbstractRequestHandlerAdvice

      【讨论】:

      • 感谢您的建议。你能看看我帖子中的更新吗?
      • 您能否在ExpressionEvaluatingRequestHandlerAdvice 中放置一个断点,以确定如何评估onFailureExpression 以及接下来会发生什么?
      • 所以表达式在引导期间被正确评估,但我不知道在执行网关时我应该在哪里设置断点来调试它?有什么想法吗?
      • 嗨 Artem,知道如何进一步调试它吗?如果我不能很快解决它,我正在考虑切换到使用 spring 数据存储库的普通句柄。
      • 好的。我今天会调试它。听起来那个建议没有被应用......
      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多