Рабочие потоки как конечные автоматы

Дата обновления перевода 2023-07-06

Рабочие потоки как конечные автоматы

Компонент рабочего потока моделируется после сети рабочего потока (Workflow net), которая является подклассом of a Petri net. Путём добавления дальнейших ограничений, вы можете получить конечный автомат. Наиболее важным аспектом является то, что конечный автомат не может находиться одновременно более, чем в одном месте. Также стоит отметить, что если рабочий поток обычно не имеет цикличный путь в графике определения, то для конечного автомата это обычное дело.

Пример конечного автомата

Запрос на включение кода начинается в иходном состоянии "старта", состоянии, например, для выполнения тестов в Travis. Когда они закончены, запрос на включение кода находится в состоянии "обзора", когда участники могут запрашивать изменения, отвергать или принимать запрос. В любое время вы также можете "обновить" запрос, что приведёт к ещё одному запуску Travis.

Ниже вы можете увидеть конфигурацию для запроса включения кода конечного автомата.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# app/config/config.yml
framework:
    workflows:
        pull_request:
            type: 'state_machine'
            supports:
                - AppBundle\Entity\PullRequest
            places:
                - start
                - coding
                - travis
                - review
                - merged
                - closed
            transitions:
                submit:
                    from: start
                    to: travis
                update:
                    from: [coding, travis, review]
                    to: travis
                wait_for_review:
                    from: travis
                    to: review
                request_change:
                    from: review
                    to: coding
                accept:
                    from: review
                    to: merged
                reject:
                    from: review
                    to: closed
                reopen:
                    from: closed
                    to: review

Теперь вы можетеиспользовать этот конечный автомат, получая сервис state_machine.pull_request service:

1
$stateMachine = $this->container->get('state_machine.pull_request');