当前位置: 首页 > 知识库问答 >
问题:

Java客户端使用异步。如果子工作流方法抛出异常,则无法编译函数调用子工作流

西门马鲁
2023-03-14

简单地说< code >未处理的异常:java.lang.Exception。试着抓住没有帮助。工作流的@WorkflowMethod允许抛出任何异常吗?

public class ChildWorkflowWorker {
    public interface ChildWorkflow {
        @WorkflowMethod
        String run(String s) throws Exception;
    }

    public static class ChildWorkflowImpl implements ChildWorkflow {

        @Override
        public String run(String s) throws Exception {
            return "";
        }
    }
}

父工作流代码

public class ParentWorkflowWorker {
    public interface ParentWorkflow {
        @WorkflowMethod
        void run();
    }

    public static class ParentWorkflowImpl implements ParentWorkflow {

        @Override
        public void run() {
            ChildWorkflowWorker.ChildWorkflow childWorkflow = Workflow.newChildWorkflowStub(ChildWorkflowWorker.ChildWorkflow.class);
            try {
                Promise<String> childPromise = Async.function(childWorkflow::run, "");
                childPromise.get();
            }
            catch (Exception e) {

            }
        }
    }
}

非常感谢。

共有1个答案

沈乐邦
2023-03-14

异步代码和检查异常不能很好地结合在一起。此外,由于子工作流和活动调用在技术上是远程方法调用,调用方抛出的异常通常不是相同的原始异常。

因此,所采用的解决方案是永远不要在活动和工作流方法签名中使用检查异常。

若要避免不必要的换行,可以使用活动包装和工作流包装方法来重新引发选中的异常。它将它包装在内部检查异常包装器异常中,该异常将在调用方处自动解开包装。

try {
    return someCall();
} catch (Exception e) {
    throw Activity.wrap(e);
}
 类似资料:
  • 我正在尝试实现一个永久的工作流,它从阻塞直到消息被传递的活动开始(即Redis的)。一旦完成,我想异步启动一个新的工作流来进行某种处理并立即返回。 我尝试使用子工作流启动处理工作流。我观察到,我的父工作流在子工作流执行之前完成。除非我处理返回的未来,但我真的不想这样做。 正确的方法是什么?是否可以在工作流中启动新的常规工作流?此类操作是作为工作流的一部分还是在活动中实现? 提前谢谢你!

  • 我有一个异步函数,我希望在失败时抛出异常。然而,似乎有一些东西阻止了这一点: 通过省略try catch块,我希望抛出一个异常,我想在函数外部处理这个异常。 我得到的实际结果有点令人困惑: 当我尝试捕获异常并抛出其他东西时,会得到相同的结果: 该函数是从try块调用的,因此看不到这如何是未处理的promise。 我正在尝试使用< code>f作为另一个函数的参数:

  • 我正在使用drools Version6.0.0.Final做一个示例hello world maven项目。下面是我的pom文件的构建,我已经指定了kie-maven-plugin,但是我可以注意到这个插件不能被执行。我是不是漏掉了什么。

  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 我按照http://elasticsearch-users.115913.n3.nabble.com/ElasticSearch-and-Mongo-DB-td4033358.html链接使用mongoDB river集成elasticsearch和mongoDB。每个组件的版本是: ubuntu 12.04 64位 Mongodb在一台服务器上独立运行,但根据此链接http://loosexam

  • 我们的父工作流代码基本上是这样的(来自组织. 我们发现,在大多数情况下,父工作流工作者无法启动子工作流,并抛出上面的超时异常。它疯狂地重试,但从未成功,并一遍又一遍地打印超时异常。然而,有时我们非常幸运,它的工作。有时在活动工作器上它甚至更早就失败了,它抛出同样的异常。我们认为这是由于数据太大(大约5MB ),无法在超时时间内发送(从日志判断,我们猜测设置为2s)。如果我们用少量虚假数据调用< c