Клиент Java использует Async. Вызов функции. Дочерний рабочий процесс не может скомпилироваться, если дочерний метод рабочего процесса выдает исключение.

Просто говорит Unhandled exception: java.lang.Exception. Попробуй поймать не помогает. Разрешено ли @WorkflowMethod рабочего процесса вообще вызывать какое-либо исключение?

https://st ackru.com/images/5ee2e392855983ba83ea2126f8ae29c9eaa22403.png Код дочернего рабочего процесса:

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 ответ

Асинхронный код и проверенные исключения несовместимы. Кроме того, поскольку дочерний рабочий процесс и вызовы действий являются технически удаленными вызовами методов, исключения, которые генерируются в вызывающей программе, обычно не совпадают с исходными исключениями.

Таким образом, принятое решение - никогда не использовать проверенные исключения в сигнатурах методов действий и рабочих процессов.

Чтобы избежать ненужного переноса, вы можете использовать методы Activity.wrap и Workflow.wrap для повторной генерации отмеченного исключения. Он будет заключать его во внутреннее исключение CheckedExceptionWrapper, которое будет автоматически развернуто у вызывающего.

try {
    return someCall();
} catch (Exception e) {
    throw Activity.wrap(e);
}
Другие вопросы по тегам