В сфере электронной коммерции,Многие предприятия имеют состояние,И эти состояния объектов многочисленны и сложны. Метод жесткого кодирования больше не подходит для управления нынешним сложным бизнес-объектостоянием. Чтобы адаптироваться к сложному и меняющемуся бизнесу,Можетиспользоватьгосударственная машина для управления состоянием, унификация потока определения бизнес-объектсостояния. Далее в этой статье речь пойдет о государственной Понятия, связанные с машинами Сценарии использования。
Прежде чем представить конечный автомат, давайте представим рабочий процесс (WorkFlow). Новички обычно легко путают эти два понятия. Рабочий процесс (WorkFlow) обычно относится к автоматизации бизнес-процессов (полностью или частично) в среде компьютерных приложений. Это описание рабочего процесса и бизнес-правил между каждым этапом операции. В компьютерных системах рабочий процесс является частью совместной работы, поддерживаемой компьютером (CSCW).
Конечный автомат — это тип рабочего процесса (WorkFlow), включающий последовательный рабочий процесс (Sequential) и рабочий процесс конечного автомата (State Machine). Конечный автомат — это аббревиатура конечного автомата, который представляет собой математическую модель, абстрагированную от правил работы реальных вещей.
Кратко объясните разницу между двумя концепциями конечного автомата и блок-схемы. Конечный автомат используется для описания всех возможных состояний конкретного объекта, а также переходов между состояниями, вызванных возникновением различных событий. Блок-схема используется для представления различных действий по завершению чего-либо, и ключевым моментом является каждый шаг.
Конечный автомат (WorkFlow) | Рабочий процесс (конечный автомат) |
---|---|
Сосредоточьтесь на одной задаче | Обратите внимание на поток статусов |
нет цикла | Циклы могут быть легко реализованы |
Просто реализовать | Это довольно хлопотно, нужно фиксировать текущий статус задачи |
Последовательное выражение, не очень гибкое | Более гибкое выражение |
Высокие продажи | Низкая эффективность, можно распараллелить |
Механизмами процессов легко злоупотребить, но конечные автоматы практичны и широко используются, главным образом, по следующим двум причинам:
Однако, когда бизнес-сценарий становится более сложным, он все равно выйдет за рамки Enum, поддерживающего только линейный поток состояний, поэтому нам придется рассмотреть конечные автоматы с открытым исходным кодом.
Я сосредоточился на реализации двух механизмов конечных автоматов: одного — Spring StateMachine, а другого — Squirrel StateMachine. Их преимуществом является то, что их функции очень полны, а недостатком — то, что их функции очень полны.
Что касается реальных проектов (на самом деле большинство проектов именно такие), то на самом деле нет необходимости во многих продвинутых способах игры с конечными автоматами: таких как вложенность состояний (Substate), параллелизм состояний (Parallel, Fork, Присоединяйтесь), подгосударственные машины и т. д. подождите.
А большинство конечных автоматов с открытым исходным кодом имеют состояние и реализованы с использованием распределенной многопоточности, что не позволяет обеспечить потокобезопасность, и в коде необходимо использовать синхронизацию блокировок. Каждый раз, когда конечный автомат получает запрос, он должен перестроить новый экземпляр конечного автомата, что приводит к снижению производительности конечного автомата с открытым исходным кодом.
преимущество | недостаток | |
---|---|---|
Spring StateMachine | 1. Мощное управление жизненным циклом | 1. Кривая обучения крутая |
2. Легко интегрироваться | 2. Может увеличить сложность проекта. | |
3. Хорошая документация и поддержка сообщества 2. | ||
Squirrel StateMachine | 1.Легкий | 1. Функции относительно ограничены |
2. Простой и удобный в использовании | ||
3. Высокая производительность | ||
Cola-StateMachine | 1. Высокая масштабируемость | 1. Относительно мало документации и поддержки сообщества. |
2. Четкая семантика и высокая читаемость. | ||
3. Безопасность резьбы |
В конце концов я выбрал Cola-StateMachine, движок конечного автомата с открытым исходным кодом.
Компонент конечного автомата структуры COLA — это небольшая, без сохранения состояния, простая, легкая и чрезвычайно высокопроизводительная реализация DSL конечного автомата, которая решает проблему потока состояний в бизнесе.
Cola-StateMachine используется Internal DSL Конкретное использование такого универсального языка, при этом DSL Написанные программы имеют стиль родного языка, который отличается от основного языка, на котором они написаны. Кола-Государственная Машина использовать Java Это самая простая реализация с самой низкой стоимостью реализации, но она не поддерживает «внешнюю конфигурацию».
Основные концепции Cola-StateMachine:
Режим работы Cola-statemachine
Основной код Cola-StateMachine
builder.externalTransition()
.from(States.STATE1)
.to(States.STATE2)
.on(Events.EVENT1)
.when(checkCondition())
.perform(doAction());
При разработке модуля заказов системы электронной коммерции заказы будут включать различные состояния, а передача между состояниями будет в центре внимания разработчиков.
Статус заказа включает в себя: инициализация, ожидающий платеж, ожидающий заказ, ожидающая отгрузки, ожидающая получения...
События заказа включают: создание заказа, успешную оплату, получение заказа, доставку, отмену заказа...
Необходимо рассмотреть следующие вопросы:
Поскольку заказ предполагает много переводов, мы выбираем использовать государственную машина двигателя для выражения состояния потока. Потому что государственная машина DSL Выразительная способность, обусловленная if-else Код должен быть более элегантным и простым для понимания. С другой стороны, конечные автоматы просты и не так примечательны, как процессоры процессов.
Шаг 1. Введение зависимостей
<dependency>
<groupId>com.alibaba.cola</groupId>
<artifactId>cola-component-statemachine</artifactId>
<version>4.2.1</version>
</dependency>
Шаг 2:определениегосударственная машина Средние базовые атрибуты:состояние、время、государственная машина. В этой практике использовать OrderStatusEnum определение Заказсостояние,использовать OrderEventParamопределение Заказсобытие,использовать OrderStateMachineIdEnum определениегосударственная машина。
//Заказсостояние public enum OrderStatusEnum {
ИНИТ("Инициализация", 0),
PAY_ONLINE("Ожидание платежа", 1),
WAITING_FOR_RECEIVED("Ожидание заказа", 2),
WAITING_DELIVERY("Ожидание отправки", 3),
PART_DELIVERY("Частичная доставка", 4),
DELIVER_ALL("К получению", 5),
ПОЛУЧЕНО("Получено", 6),
ГОТОВО("Готово", 7),
ОТМЕНА("Закрыть",8);
}
//Заказсобытие public enum OrderEventEnum {
CREATE_ORDER(1, «Создать заказ»),
REPAY(2, "платить"),
CANCEL_ORDER(3, «Отменить заказ»),
TAKE_ORDER(4, «принимаю заказы»),
REJECT_ORDER(5, «Отклонить заказ»),
DELIVERY_PART(6, «Частичная доставка»),
DELIVERY_ALL(7, "все отправлено"),
CONFIRM_RECEIPT(8, «подтвердить получение товара»),
EXTEND_RECEIPT(9, «Расширенная доставка»),
COMPLETE(10, «Транзакция завершена»);
}
//Заказгосударственная машинаID перечислять
public enum OrderStateMachineIdEnum {
ORDER_OF_SALE("ORDER_OF_SALE",
OrderBizEnum.SALE_ORDER,"Заказгосударственная машина");
}
Третий шаг: определение порядка состояния потока событий. Бетониспользование Builder и Fluent Interface способ обеспечить порядок вызовов кода. Например, в From может вызвать To только после , таким образом гарантируя, что государственная машина построения семантической корректности и связности. Мы используемгосударственную машина Builder,Подтвердить состояние Переходный режим (Переход),перениматьсостояние(From),определениедействие(On),Проверить состояние (когда),осуществлятьсобытие(Perform),Затем верните целевое состояние (To).
Когда добавляется новое событие заказа, просто добавьте соответствующее событие в этот конечный автомат и в то же время сохраните связь между событием заказа и методом реализации события.
public class OrderOfSaleStateMachine implements OrderStateMachine {
public void initialize() {
//верногосударственная машина начинает сборку и регистрируется в StateMachineFactory
StateMachineBuilder<OrderStatusEnum, OrderEventEnum, OrderContext> builder
= StateMachineBuilderFactory.create();
/**
* Создать заказ: инициализация -> Платить
* externalTransition : Строитель для потока
*/
builder.externalTransition().from(OrderStatusEnum.INIT).to(OrderStatusEnum.PAY_ONLINE)
.on(OrderEventEnum.CREATE_ORDER).when(checkOrder()).perform(createOrderAction);
/**
* Частичная доставка: Частичная доставка
* internalTransition : Внутреннее кровообращение
*/
builder.internalTransition()
.within(OrderStatusEnum.PART_DELIVERY)
.on(OrderEventEnum.DELIVERY_PART)
.when(checkOrder())
.perform(deliverOrderAction);
/**
* Отменить заказ: Платить、Ожидание Отправление, ожидаю получения -> Платить
* externalTransitions : Построитель для нескольких потоков
*/
builder.externalTransitions()
.fromAmong(OrderStatusEnum.PAY_ONLINE,OrderStatusEnum.WAITING_FOR_RECEIVED, OrderStatusEnum.WAITING_DELIVERY)
.to(OrderStatusEnum.CANCEL)
.on(OrderEventEnum.CANCEL_ORDER)
.when(checkOrder())
.perform(cancelOrderAction);
// Описание: кола statemachine После сборки он автоматически StateMachineFactory зарегистрироваться.
// После успешного строительства, по данным StateMachineFactory.get(machineId) получатьгосударственная машина, повторная сборка не разрешена, и повторная сборка сообщит об ошибке.
builder.build(this.getStateMachineIdEnum().getMachineId());
}
@Override
public OrderStateMachineIdEnum getStateMachineIdEnum() {
return OrderStateMachineIdEnum.ORDER_OF_SALE;
}
/*
* Установите построитель внешнего типа escape-состояния и установите from\to\on\when\perform
*/
builder.externalTransition()
.from(OrderStatusEnum.INIT)
.to(OrderStatusEnum.PAY_ONLINE)
.on(OrderEventEnum.CREATE_ORDER)
.when(checkOrder())
.perform(createOrderAction);
Описание: Начальным статусом заказа является «Инициализация». При возникновении события «Создать заказ» выполняется escape-код. При выполнении CheckCondition выполняется CreateOrderAction.
public class CreateOrderAction implements Action<OrderStatusEnum, OrderEventEnum, OrderContext> {
@Override
public void execute(OrderStatusEnum from, OrderStatusEnum to, OrderEventEnum event, OrderContext context) {
// ...
// 1.получатьгосударственная машина
StateMachine<OrderStatusEnum, OrderEventEnum, OrderContext> stateMachine = getStateMachine();
// 2.Группагосударственная машина messageContext
OrderContext orderContext = buildContext();
// 3.государственная машинасобытиекурок stateMachine.fireEvent(OrderStatusEnum.INIT, OrderEventEnum.CREATE_ORDER, orderContext);
// ...
}
}
Описание: CreateOrderAction реализует создание событий заказа и запускает события конечного автомата через StateMachine.FireEvent.
/**
* Частичная доставка: Частичная доставка
* internalTransition : Внутреннее кровообращение
*/
builder.internalTransition()
.within(OrderStatusEnum.PART_DELIVERY)
.on(OrderEventEnum.DELIVERY_PART)
.when(checkOrder())
.perform(deliverOrderAction);
Описание: Начальный статус заказа находится в состоянии частичной доставки. При доставке выполняется поток состояния. При выполнении условия CheckCondition (условие частичной доставки заказа) выполняется действие DeliverOrderAction. возвращается статус: частичная доставка.
/**
* Отменить заказ: Платить、Ожидание Отправление, ожидаю получения -> Платить
* externalTransitions : Построитель для нескольких потоков
*/
builder.externalTransitions()
.fromAmong(OrderStatusEnum.PAY_ONLINE,OrderStatusEnum.WAITING_FOR_RECEIVED,OrderStatusEnum.WAITING_DELIVERY)
.to(OrderStatusEnum.CANCEL)
.on(OrderEventEnum.CANCEL_ORDER)
.when(checkOrder())
.perform(cancelOrderAction);
Описание: Начальный статус заказа: ожидающий платеж, ожидающий отгрузки или ожидающий поступления. Когда происходит событие отмены заказа и выполняется CheckCondition, выполняется CancelOrderAction и возвращается статус CANCEL_ORDER.
Cola-StateMachine Как проект с открытым исходным кодом Alibaba. COLA Самая большая особенность легковесного компонента конечного автомата заключается в том, что он не имеет состояния и использует чистый Java осознавать, использовать Fluent Interface (согласованный интерфейс)определениесостояниеисобытие,Доступен для управлениясостояниепереключить сцену。например:Заказсостояние、платитьсостояние Простой и ограниченныйсостояниесцена。
https://blog.csdn.net/significantfrank/article/details/104996419
https://www.jianshu.com/p/895047a04ae5
https://blog.csdn.net/qq_28959087/article/details/118359809