SWF: Как я могу сигнализировать родительский рабочий процесс из дочернего рабочего процесса? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь дать сигнал своему родительскому рабочему процессу обновить его переменную состояния. Идентификатор родительского рабочего процесса передается методу execute дочернего рабочего процесса.

@Autowired
private AmazonSimpleWorkflowClient swfClient;
@Autowired
private String swfDomain;

private ParentWorkflowClientExternalFactory clientExternalFactory = new ParentWorkflowClientExternalFactoryImpl(swfClient, swfDomain);

@Override
public Promise<String> childActivityMethod(String parentWorkflowId) {
    ParentWorkflowClientExternal clientExternal = clientExternalFactory.getClient(parentWorkflowId);
    clientExternal.updateState(...);
}

Однако в SWF-код добавляется NullPointerException (AmazonSimpleWorkflow имеет значение null):

["java.lang.NullPointerException",{"cause":null,"stackTrace":[{"methodName":"signalWorkflowExecution","fileName":"GenericWorkflowClientExternalImpl.java","lineNumber":87,"className":"com.amazonaws.services.simpleworkflow.flow.worker.GenericWorkflowClientExternalImpl","nativeMethod":false},{"methodName":"signalWorkflowExecution","fileName":"DynamicWorkflowClientExternalImpl.java","lineNumber":167,"className":"com.amazonaws.services.simpleworkflow.flow.DynamicWorkflowClientExternalImpl","nativeMethod":false},...

Когда я инициализирую ClientExternalFactory без параметров:

private ParentWorkflowClientExternalFactory clientExternalFactory = new ParentWorkflowClientExternalFactoryImpl();

Исключение составляет: The required property genericClient is null. It could be caused by instantiating the factory through the default constructor instead of the one that takes service and domain arguments.

ParentWorkflow#updateState делает это:

private MyWorkflowState state;

// This method has @Signal in the interface.
@Override
public void updateState(MyWorkflowState newState) {
    state = newState;
}

Любой совет?

1 Ответ

0 голосов
/ 27 апреля 2018

Существует два типа клиентов, сгенерированных из интерфейсов рабочих процессов. Внутренние и внешние. Ожидается, что внутренние будут использоваться из кода рабочего процесса, а внешние будут использоваться вне рабочего процесса (например, с веб-сервера). Вы пытаетесь использовать внешний клиент внутри рабочего процесса, который не поддерживается. Вместо этого используйте внутренний клиент (созданный с использованием ParentWorkflowClientFactory). Подробнее см. Руководство по разработке Flow .

...