Клиент 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);
}