如果子工作流程方法引发异常,则Java客户端使用Async.function调用子工作流程无法编译

时间:2020-06-19 06:53:32

标签: cadence-workflow temporal-workflow

简单地说Unhandled exception: java.lang.Exception。尝试捕获没有帮助。工作流的@WorkflowMethod是否可以引发任何异常?

enter image description here 子工作流程代码:

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 个答案:

答案 0 :(得分:0)

异步代码和检查的异常不能很好地配合使用。同样,由于子工作流程和活动调用在技术上是远程方法调用,因此在调用方中引发的异常通常与原始异常不同。

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

为避免不必要的包装,可以使用Activity.wrapWorkflow.wrap方法重新抛出已检查的异常。它将包装在内部CheckedExceptionWrapper异常中,该异常将在调用方处自动展开。

try {
    return someCall();
} catch (Exception e) {
    throw Activity.wrap(e);
}