Я пытаюсь дать сигнал своему родительскому рабочему процессу обновить переменную состояния. Идентификатор родительского рабочего процесса передается методу дочернего рабочего процесса 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(...);
}

Однако это вызывает NullPointerException в коде SWF (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;
}

Любой совет?

0
gruuuvy 26 Апр 2018 в 22:44

1 ответ

Лучший ответ

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

2
Maxim Fateev 26 Апр 2018 в 21:01