in core/src/main/java/com/alibaba/smart/framework/engine/configuration/impl/DefaultParallelServiceOrchestration.java [134:160]
private void acquireFutureResult(ExecutionContext context, ProcessEngineConfiguration processEngineConfiguration, Long latchWaitTime, boolean isSkipTimeoutExp, List<Future<ExecutionContext>> futureExecutionResultList) throws TimeoutException {
//注意这里的逻辑:这里假设是子线程在执行某个fork分支的逻辑后,然后会在join节点时返回。这个join节点就是 futureJoinParallelGateWay。
// 当await 执行结束后,这里的假设不变式:所有子线程都已经到达了join节点。
ExceptionProcessor exceptionProcessor = processEngineConfiguration.getExceptionProcessor();
for (Future<ExecutionContext> pvmActivityFuture : futureExecutionResultList) {
try {
if (hasValidLatchWaitTime(latchWaitTime)) {
pvmActivityFuture.get(latchWaitTime, TimeUnit.MILLISECONDS);
} else {
pvmActivityFuture.get();
}
} catch (InterruptedException e) {
exceptionProcessor.process(e, context);
} catch (ExecutionException e) {
exceptionProcessor.process(e, context);
} catch (CancellationException e) {
// 忽略超时异常
if (isSkipTimeoutExp) {
// 跳过超时异常,只记录log
log.warn("parallel gateway occur timeout, skip exception!", e);
} else {
throw e;
}
}
}
}