AWS SWF — результаты действий, передающих рабочий процесс, с сигналами, управляющими рабочим процессом

У меня есть требование использовать AWS Simple Workflow (SWF) для оркестровки проектирования системы. Существует родительское приложение, которое запускает этот дочерний рабочий процесс, а затем сигнализирует рабочему процессу о работе над действиями. У меня есть рабочий процесс, который запускается и ожидает появления сигналов, прежде чем он сможет начать работу. Как только одно действие будет выполнено, оно сообщит об этом, закрыв действие в родительском рабочем процессе.

Как дождаться сигнала, а также использовать результаты другого действия, вызванного сигналом?

Нужно ли мне просматривать историю выполнения для результата действия, а не полагаться на выполнение этой работы при принятии решения?

Спасибо за помощь

Пример кода:

@SuppressWarnings("unused")
@Slf4j
public class ChildWorkflowImpl implements ChildWorkflow {
    private final Settable<Message> firstStepReceived = new Settable<>();
    private final Settable<Message> secondStepReceived = new Settable<>();


    @Autowired
    private FirstActivityClient firstActivityClient;

    @Autowired
    private SecondActivityClient secondActivityClient;


    @Autowired
    private AmazonSimpleWorkflow amazonSimpleWorkflow;

    @Override
    public void startWorkflow(SubsystemMessage subsystemMessage) {

        //wait for signal to start
        new Task(firstStepReceived) {
            @Override
            protected void doExecute() throws Throwable {
                //Initiate Activity

                startStage(firstStepReceived.get(););
            }
        };

        //wait for second signal but pass in data from first activity
        new Task(secondStepReceived) {
            @Override
            protected void doExecute() throws Throwable {

            }
        };


    }

    public void firstStep(Message message) {
        Promise<FirstActivityResponse> firstActivity = firstActivityClient.execute();

        //wait for signal for disable
        new Task(firstActivity) {
            public void doExecute() {
                //report back status for stage by closing parent activity
            }
        };
    }

    public void secondStep(FirstActivityResponse response) {
        Promise<SecondActivityResponse> secondActivityResponse = secondActivityClient.execute(response);

        new Task(secondActivityResponse) {
            public void doExecute() {
                //report back status for stage
            }
        };

    }
}

person user2884282    schedule 10.08.2020    source источник


Ответы (1)


Вы добавляете сигнальный метод в интерфейс рабочего процесса и используете Settable для уведомления другой части кода рабочего процесса о сигнале. См. документацию по Settable на странице этой документации.

КСТАТИ. Я рекомендую просмотреть temporal.io, который представляет собой значительно улучшенную версию SWF, поддерживает синхронное программирование без всех этих надоедливых задач.

person Maxim Fateev    schedule 11.08.2020