Cola状态机实战

一个轻量实用的Java状态机框架--Cola-StateMachine 详解Java状态机框架--Cola-StateMachine 阅读详情
AI摘要

本文围绕Java状态机展开,介绍了其依赖并进行实战。实战部分包括定义状态枚举、事件枚举、状态机ID,还说明了context、condition、action的作用,阐述了状态机配置,如内部、外部、批量状态流转,此外介绍了helper工具类及示例触发事件。

一.简介

状态机模式通常用于定义一个对象在有限状态间流转的行为,比如常见的订单中,通常有待支付,已支付,已发货,已完成,已取消,已退款等, 且这些状态的转换都是提前定义好的。这样可以用状态机来定义各个状态间的流转事件和触发事件,比如从待支付到已支付需要触发支付操作,而在触发的事件里可以定义不同的操作,比如支付完成之后发放优惠券等。

二.依赖
 <dependency>
     <groupId>com.alibaba.cola</groupId>
     <artifactId>cola-component-statemachine</artifactId>
     <version>最新版本</version>
 </dependency>
三.实战

此处贴出我在项目中使用的状态机的UML图, 其中部分状态是在此项目中的特殊业务状态:

(1)定义状态枚举

状态枚举用于定义状态机会变更到的所有状态

public enum OrderState {

    INIT(1, "已创建"),
    WAITING_FOR_PAY(5, "待支付"),
    WAITING_FOR_ASSIGNED(9,"待分配"),
    ASSIGNED_PART(10,"部分分配"),
    WAITING_FOR_DELIVER(13, "待发货"),
    WAITING_FOR_LOCK(17, "待锁单"),
    COMPLETE(21, "已完成"),
    CANCEL(25, "已取消"),
    WAITING_FOR_REFUND(29, "待退款"),
    REFUNDED(33, "已退款"),
    ;


    private String msg;
    private int code;

    OrderState(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return this.code;
    }

    public String getMsg() {
        return this.msg;
    }

    public static OrderState getInstance(int code) {

        for (OrderState value : values()) {
            if (value.code == code) {
                return value;
            }
        }
        return null;
    }
}
(2)定义事件枚举

事件枚举是状态机会触发的所有事件

public enum OrderEvent {

	CREATE_ORDER(1, "创建订单"),
	PAY(2, "支付"),
	CANCEL_ORDER(3, "取消订单"),
	ASSIGNED(4, "分配号码"),
	PART_ASSIGNED(5, "部分分配"),
	CANCEL_ASSIGNED(6, "取消分配"),
	PART_CANCEL_ASSIGNED(7, "部分取消分配"),
	DELIVERY(8, "发货"),
	LOCK(9, "锁单"),
	APPLY_FOR_REFUND(10, "申请退款"),
	REFUND(11, "退款"),
	;


	private String msg;

	private int code;

	OrderEvent(int code, String msg) {
		this.code = code;
		this.msg = msg;
	}

}
(3)状态机ID

状态机ID是每个状态机的唯一ID, 此处用枚举保存, 也可以用常量

public enum OrderStateMachineIdEnum {

	CARD_ORDER("ORDER_STATE_MACHINE", "订单状态机");

	private String machineId;

	private String name;

	OrderStateMachineIdEnum(String machineId, String name) {
		this.machineId = machineId;
		this.name = name;
	}

	public String getMachineId() {
		return this.machineId;
	}

	public String getName() {
		return this.name;
	}
}

StateMachine<OrderState, OrderEvent, OrderContext> orderStateMachine = StateMachineFactory.get(OrderStateMachineIdEnum.CARD_ORDER.name());

// 此方法用于获取状态机的UML图 生成的是字符串 需要使用工具转换成上面的UML图(直接找个在线工具即可)
System.out.println(orderStateMachine.generatePlantUML());

(4)context

context 是用于在状态机中传输数据的上下文

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderContext {

	// 订单编号
	private String orderNo;

	// 其他参数 此处使用超类 Object 可以接收任意类型, 使用时根据类型转换
	private Object context;

}
(5)conditon

condition是用于定义从一个状态扭转到另一个状态的必须条件, 只有返回值为true会执行后续的action

@Slf4j
@Component
public class OrderCheckCancelCondition implements Condition<OrderContext> {


	@Override
	public boolean isSatisfied(OrderContext orderContext) {

		log.info("订单:{},取消前校验完成", orderContext.getOrderNo());
		return true;
	}

}

(6)action

action是用于定义从一个状态扭转到另一个状态之后触发的动作

@Slf4j
@Component
@AllArgsConstructor
public class OrderCreateAction implements Action<OrderState, OrderEvent, OrderContext> {

	private final IOrderService orderService;


	@Override
	public void execute(OrderState from, OrderState to, OrderEvent orderEvent, OrderContext orderContext) {
		log.info("创建订单,订单编号:{}", orderContext.getOrderNo());
		CreateOrderDTO createOrderDTO = (CreateOrderDTO) orderContext.getContext();

		orderService.doCreateOrder(to, orderContext.getOrderNo(), createOrderDTO);

	}

}
(7)状态机配置

cola状态机可以定义内部状态流转,外部状态流转,批量状态流转

externalTransition用于定义外部状态流转, from表示当前状态, to表示扭转后的状态,when表示需要满足的条件, perform表示需要执行的动作(action)

internalTransition用于定于内部状态流转, within表示状态, 内部状态流转不用定义to

externalTransitions用于定义批量状态流转, 也就是从多个状态可以抵达同一个状态,比如: 订单在已发货,已锁单等状态都可以进行退款操作, fromAmong表示多个from的状态

@Component
@AllArgsConstructor
public class OrderStateMachine {

	private final OrderActionHelper orderActionHelper;
	private final OrderConditionHelper orderConditionHelper;


	@PostConstruct
	public StateMachine<OrderState, OrderEvent, OrderContext> createStateMachine() {
		// 创建状态机
		StateMachineBuilder<OrderState, OrderEvent, OrderContext> builder = StateMachineBuilderFactory.create();

		// 外部状态流转 从init到待支付 需要触发创建订单操作
		builder.externalTransition()
			.from(OrderState.INIT)
			.to(OrderState.WAITING_FOR_PAY)
			.on(OrderEvent.CREATE_ORDER)
			.when(orderConditionHelper.getOrderCheckCreateCondition())
			.perform(orderActionHelper.getOrderCreateAction());

		// 外部状态流转 从待支付到已取消 需要触发取消订单操作
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_PAY)
			.to(OrderState.CANCEL)
			.on(OrderEvent.CANCEL_ORDER)
			.when(orderConditionHelper.getOrderCheckCancelCondition())
			.perform(orderActionHelper.getOrderCancelAction());

		// 外部状态流转 从待支付到待分配 需要触发支付操作
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_PAY)
			.to(OrderState.WAITING_FOR_ASSIGNED)
			.on(OrderEvent.PAY)
			.when(orderConditionHelper.getOrderCheckPayCondition())
			.perform(orderActionHelper.getOrderPayAction());

		// 外部状态流转 从待分配到部分分配 需要触发部分分配操作
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_ASSIGNED)
			.to(OrderState.ASSIGNED_PART)
			.on(OrderEvent.PART_ASSIGNED)
			.when(orderConditionHelper.getOrderCheckPartAssignCondition())
			.perform(orderActionHelper.getOrderPartAssignAction());

		// 内部状态流转 部分分配 需要触发部分分配操作
		builder.internalTransition().within(OrderState.ASSIGNED_PART)
			.on(OrderEvent.PART_ASSIGNED)
			.when(orderConditionHelper.getOrderCheckPartAssignCondition())
			.perform(orderActionHelper.getOrderPartAssignAction());

		// 外部状态流转 从待分配,部分分配到待发货 需要触发分配操作
		builder.externalTransitions()
			.fromAmong(OrderState.ASSIGNED_PART, OrderState.WAITING_FOR_ASSIGNED)
			.to(OrderState.WAITING_FOR_DELIVER)
			.on(OrderEvent.ASSIGNED)
			.when(orderConditionHelper.getOrderCheckAssignCondition())
			.perform(orderActionHelper.getOrderAssignAction());

		// 外部状态流转 从待发货到部分分配 需要触发部分取消分配事件
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_DELIVER)
			.to(OrderState.ASSIGNED_PART)
			.on(OrderEvent.PART_CANCEL_ASSIGNED)
			.when(orderConditionHelper.getOrderCheckPartCancelAssignedCondition())
			.perform(orderActionHelper.getOrderPartCancelAssignAction());

		// 外部状态流转 从待发货,部分分配到待分配 需要触发取消分配事件
		builder.externalTransitions()
			.fromAmong(OrderState.WAITING_FOR_DELIVER, OrderState.ASSIGNED_PART)
			.to(OrderState.WAITING_FOR_ASSIGNED)
			.on(OrderEvent.CANCEL_ASSIGNED)
			.when(orderConditionHelper.getOrderCheckCancelAssignCondition())
			.perform(orderActionHelper.getOrderCancelAssignAction());

		// 内部状态流转 部分分配 需要触发部分取消分配操作
		builder.internalTransition().within(OrderState.ASSIGNED_PART)
			.on(OrderEvent.PART_CANCEL_ASSIGNED)
			.when(orderConditionHelper.getOrderCheckPartCancelAssignedCondition())
			.perform(orderActionHelper.getOrderPartCancelAssignAction());

		// 外部状态流转 从待发货到待锁单 需要触发发货事件
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_DELIVER)
			.to(OrderState.WAITING_FOR_LOCK)
			.on(OrderEvent.DELIVERY)
			.when(orderConditionHelper.getOrderCheckDeliveryCondition())
			.perform(orderActionHelper.getOrderDeliveryAction());

		// 外部状态流转 从待锁单到已完成 需要触发锁单事件
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_LOCK)
			.to(OrderState.COMPLETE)
			.on(OrderEvent.LOCK)
			.when(orderConditionHelper.getOrderCheckLockCondition())
			.perform(orderActionHelper.getOrderLockAction());

		// 外部状态流转 从待分配,部分分配,待发货,待锁单,已完成到待退款 需要触发申请退款事件
		builder.externalTransitions()
			.fromAmong(OrderState.WAITING_FOR_ASSIGNED, OrderState.ASSIGNED_PART, OrderState.WAITING_FOR_DELIVER,
				OrderState.WAITING_FOR_LOCK, OrderState.COMPLETE)
			.to(OrderState.WAITING_FOR_REFUND)
			.on(OrderEvent.APPLY_FOR_REFUND)
			.when(orderConditionHelper.getOrderCheckApplyForRefundedCondition())
			.perform(orderActionHelper.getOrderApplyForRefundedAction());

		// 外部状态流转 从待退款到已退款 需要触发退款事件
		builder.externalTransition()
			.from(OrderState.WAITING_FOR_REFUND)
			.to(OrderState.REFUNDED)
			.on(OrderEvent.REFUND)
			.when(orderConditionHelper.getOrderCheckRefundedCondition())
			.perform(orderActionHelper.getOrderRefundedAction());

		return builder.build(OrderStateMachineIdEnum.CARD_ORDER.getMachineId());
	}

}
(9) helper工具类

定义下面两个工具类的目的在于, 在状态机的配置类中就不需要分别注入依赖, 只需要注入这两个Bean就可以, 不想使用这种方式也可以在状态机配置类中分别注入


@Component
@AllArgsConstructor
public class OrderActionHelper {


	private final OrderCreateAction orderCreateAction;
	private final OrderCancelAction orderCancelAction;
	private final OrderPayAction orderPayAction;
	private final OrderPartAssignAction orderPartAssignAction;
	private final OrderAssignAction orderAssignAction;
	private final OrderPartCancelAssignAction orderPartCancelAssignAction;
	private final OrderCancelAssignAction orderCancelAssignAction;
	private final OrderDeliveryAction orderDeliveryAction;
	private final OrderLockAction orderLockAction;
	private final OrderApplyForRefundedAction orderApplyForRefundedAction;
	private final OrderRefundedAction orderRefundedAction;

	public Action<OrderState, OrderEvent, OrderContext> getOrderCreateAction() {
		return orderCreateAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderCancelAction() {
		return orderCancelAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderPayAction() {
		return orderPayAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderPartAssignAction() {
		return orderPartAssignAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderAssignAction() {
		return orderAssignAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderPartCancelAssignAction() {
		return orderPartCancelAssignAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderCancelAssignAction() {
		return orderCancelAssignAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderDeliveryAction() {
		return orderDeliveryAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderLockAction() {
		return orderLockAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderApplyForRefundedAction() {
		return orderApplyForRefundedAction;
	}

	public Action<OrderState, OrderEvent, OrderContext> getOrderRefundedAction() {
		return orderRefundedAction;
	}
}


@Component
@AllArgsConstructor
public class OrderConditionHelper {

	private final OrderCheckCreateCondition orderCheckCreateCondition;
	private final OrderCheckCancelCondition orderCheckCancelCondition;
	private final OrderCheckPayCondition orderCheckPayCondition;
	private final OrderCheckPartAssignCondition orderCheckPartAssignCondition;
	private final OrderCheckAssignCondition orderCheckAssignCondition;
	private final OrderCheckPartCancelAssignedCondition orderCheckPartCancelAssignedCondition;
	private final OrderCheckCancelAssignCondition orderCheckCancelAssignCondition;
	private final OrderCheckDeliveryCondition orderCheckDeliveryCondition;
	private final OrderCheckLockCondition orderCheckLockCondition;
	private final OrderCheckApplyForRefundedCondition orderCheckApplyForRefundedCondition;
	private final OrderCheckRefundedCondition orderCheckRefundedCondition;

	public Condition<OrderContext> getOrderCheckCreateCondition() {
		return orderCheckCreateCondition;
	}

	public Condition<OrderContext> getOrderCheckCancelCondition() {
		return orderCheckCancelCondition;
	}

	public Condition<OrderContext> getOrderCheckPayCondition() {
		return orderCheckPayCondition;
	}

	public Condition<OrderContext> getOrderCheckPartAssignCondition() {
		return orderCheckPartAssignCondition;
	}

	public Condition<OrderContext> getOrderCheckAssignCondition() {
		return orderCheckAssignCondition;
	}

	public Condition<OrderContext> getOrderCheckPartCancelAssignedCondition() {
		return orderCheckPartCancelAssignedCondition;
	}

	public Condition<OrderContext> getOrderCheckCancelAssignCondition() {
		return orderCheckCancelAssignCondition;
	}

	public Condition<OrderContext> getOrderCheckDeliveryCondition() {
		return orderCheckDeliveryCondition;
	}

	public Condition<OrderContext> getOrderCheckLockCondition() {
		return orderCheckLockCondition;
	}

	public Condition<OrderContext> getOrderCheckApplyForRefundedCondition() {
		return orderCheckApplyForRefundedCondition;
	}

	public Condition<OrderContext> getOrderCheckRefundedCondition() {
		return orderCheckRefundedCondition;
	}
}

(10)示例触发事件

通过fireEvent()方法可以触发事件, 如果需要对操作进行加锁, 可以直接对此方法加锁

	public void cancelOrder(String orderNo) {

		StateMachine<OrderState, OrderEvent, OrderContext> orderStateMachine = StateMachineFactory.get(OrderStateMachineIdEnum.CARD_ORDER.getMachineId());

		// 此处使用分布式锁处理
		orderUtil.handlerWithLock(orderNo, () -> {

			OrderRecordEntity order = getByOrderNo(orderNo);
			checkOrderExists(order);

			OrderContext orderContext = new OrderContext();
			orderContext.setOrderNo(orderNo);
			orderContext.setOrder(order);

			OrderState orderState = orderStateMachine.fireEvent(OrderState.getInstance(order.getStatus()), OrderEvent.CANCEL_ORDER, orderContext);

			if (OrderState.CANCEL.getCode() != orderState.getCode()) {
				throw new ServiceException("此状态无法取消订单!");
			}
		});


	}
	/**
	 * 阻塞式获取锁处理订单
	 * @param orderNo
	 * @param runnable
	 */
	public void handlerWithLock(String orderNo, Runnable runnable) {

		RLock orderLock = redissonClient.getLock(orderNo);

		orderLock.lock();

		try {

			runnable.run();

		} finally {

			orderLock.unlock();

		}

	}
状态机的理解与使用【开发实践】 状态机 阅读详情

相关推荐

COLA架构与框架的双重身份:如何在实际项目中发挥DDD优势?

本文深入解析了COLA架构与框架的双重身份,阐述了其如何作为一套基于DDD思想的结构性约束与最佳实践(架构),同时提供可复用的代码组件(框架)来提升开发效率。通过六边形架构、清晰的分层设计以及扩展点等机制,COLA为领域驱动设计(DDD)的落地提供了具体路径,帮助团队在实际项目中构建结构清晰、易于维护和扩展的高质量代码。

weixin_28365523的博客 401

COLA中的cola-statemachine状态机理解与使用例

COLA中的cola-statemachine状态机理解与使用例

qq_40890575的博客 1万+

来聊聊一个轻量级的有限状态机Cola-StateMachine

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。完成上述配置后,我们就可以在业务代码上使用这套状态机了,我们在开发买家支付方法时,只需将状态机注入,然后调用状态机的。重点来了,接下来就是订单状态扭转和事件的绑定,这里笔者简单说明一下,完成一个简单的案例快速入门了状态机的使用,希望对你有帮助。

禅与计算机程序设计的艺术 1063

【Alibaba Cola 状态机】重点解析以及实践案例

相比Spring statemachine状态机等的复杂,功能多,但是我们实际业务员需要常用的功能,简单使用,所以这类就显得不简洁;再看cola-statemachine相比就是小巧、无状态、简单、轻量、性能极高的状态机DSL实现,解决业务中的状态流转问题。 如果是实现业务的话,阿里状态机是不二之选,更加适合我们日常开发!KISS(Keep It Simple and Stupid)

Carefree_State的博客 5724

COLA-开源

如果您决定使用代码,请引用我们的论文。 论文详情为:王思伯、肖奎、尹阳、林文清。 大型路网中近似约束最短路径查询的有效索引。 Proceedings of the VLDB Endowment (PVLDB), 10(2): 61-72, 2016. 在这个项目中,我们包含了源代码 (COLA_code.zip) 和我们在实验中使用的数据集、查询集 (COLA_datasets.zip) . 查看项目中的文件,点击“Browse All Files” 编译 $cd COLA_code/ $g++ cola.cpp -O3 -o cola -std=c++11 可以使用 preprocessing.batch 脚本进行预处理 我们有由于 sourceforge 中文件的大小限制,删除了一些数据集。 为了生成分区,我们使用由 Yu Sun 提供的代码,该代码可在 https://github.com/aldrichsun/Graph-Partitioning-with-Natural-Cuts 公开获得

管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程.doc

管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程.doc

彻底解决并发安全!COLA状态机线程测试实战

你还在为状态机并发场景下的数据错乱头疼吗?订单状态在高并发下莫名跳转、支付流程因线程竞争导致状态不一致?本文将带你用COLA框架的状态机组件结合CountDownLatch工具,从零构建线程安全的状态流转测试方案,确保你的状态机在任何并发场景下都能稳定运行。 ## 状态机组件核心能力解析 COLA框架的状态机组件([cola-component-statemachine](https://li...

gitblog_01059的博客 758

C#与发那科机器人通信实战:从SDK配置到机械臂控制

本文详细介绍了如何使用C#与发那科机器人进行通信,从SDK配置到机械臂控制的完整实战流程。内容包括环境准备、通信连接建立、机械臂运动控制、异常处理与状态监控,以及高级功能实战,帮助开发者快速掌握工业机器人编程技术。

weixin_42524276的博客 457

深度解析COLA状态机3大异步化策略:生产级性能优化实战指南

在当今高并发微服务架构中,状态机作为业务流程编排的核心组件,其性能直接影响系统吞吐量和响应时间。COLA框架的状态机组件以其简洁的DSL设计和强大的表达能力著称,但在面对IO密集型操作时,同步执行模式成为性能瓶颈的关键所在。本文将带你深入剖析COLA状态机的异步化改造策略,通过3种实战方案彻底释放系统性能潜力。 ## 同步状态机的性能瓶颈分析 COLA状态机组件位于src/main/java/

gitblog_00679的博客 207

审稿人看了直呼内行:多组学整合分析——科研小白进阶之路

多组学,多平台分析解决方案

pysonger的博客 3944

基于DPLL算法解决3-SAT问题(C++实现)

近日看到一个3-SAT问题(Boolean SATisfiability Problem, 布尔逻辑可满足性问题),试着写了个算法求解。

qq_63241496的博客 2215

解决COLA状态机并发冲突:乐观锁与悲观锁终极实战指南

COLA(Clean Object-oriented & Layered Architecture)作为一种清晰的面向对象分层架构,其状态机组件在处理复杂业务流程时表现出色。然而在多线程环境下,状态机的并发冲突问题可能导致数据不一致或业务异常。本文将系统介绍如何在COLA架构中运用乐观锁与悲观锁机制,彻底解决状态机并发访问的难题。 ## 📌 COLA状态机并发挑战 COLA框架的状态机组件(

gitblog_00775的博客 411

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 262

管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程

在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值。去年笔者进入了电商领域从事后端开发。电商领域,状态又多又复杂,如果仍然在业务代码中东一块西一块维护状态值,很容易陷入出了问题难于Debug,难于追责的窘境。

蛮三刀酱 3283

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

本文深入解析了SIM卡通信的电气信号与时序规则,通过示波器实测波形揭示SIM卡上电时序与通信协议的关键细节。从VCC、CLK、RST、DATA四路信号的协同工作,到ATR(Answer to Reset)的解析,再到常见故障的波形诊断与排查方法,为硬件工程师提供了实用的调试指南。文章还分享了高级调试技巧与现代化工具链搭建建议,帮助提升物联网设备SIM卡通信的可靠性与效率。

weixin_42567279的博客 325

【YOLO目标检测全栈实战】98 YOLO模型在低光照环境下的自适应增强策略

你有没有遇到过这种情况?深夜加班调试产线检测模型,车间灯光昏暗,摄像头采集的图片黑乎乎一片,YOLO模型直接“罢工”——漏检率飙升到40%以上。上个月我在一个汽车零部件质检项目里就栽了跟头:白天模型跑得飞起,mAP@0.5达到0.92,可一到夜班,同样的产线、同样的零件,mAP直接掉到0.63。客户拍着桌子问我:“你这模型怎么还分白天黑夜?”

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 284

COLA状态机组件实战:用StateMachine接口构建复杂业务流转系统

你是否还在为业务系统中的状态流转逻辑混乱而头疼?订单从创建到支付再到发货的状态变化,用户从注册到认证再到活跃的生命周期管理,这些复杂的状态流转往往导致代码中充斥着大量的if-else判断和状态检查,不仅难以维护,还容易引发bug。 本文将带你深入了解COLA框架中的状态机(StateMachine)组件,通过实战案例展示如何利用`StateMachine`接口构建清晰、可扩展的业务流转系统。读完...

gitblog_00735的博客 1365

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1800

探索状态驱动开发的奇妙世界——Cola-StateMachine的介绍与使用

前面接受了Spring实现的状态机,这个状态机的优点在于功能很完备,缺点也是功能十分完备。完备到什么程度了,提供了状态机的高级玩法,比如状态的嵌套、状态的并行、子状态机等等。但是在开发中我们并不需要这些。除此之外,就是性能差的问题,包括但不仅限于在内的所有开源状态机都是有状态的,也就意味着状态机记住先前的状态和输入,以便在进行状态转换时使用这些信息作出决策。这就导致了这些有状态的状态机出现了线程安全的问题。而我们的系统往往是分布式多线程的,所以为了解决线程安全问题,我们不得不每次都要build一个实例。

沉迷写代码的程序猿的博客 4732

Claude Code 实战 从零教你用 Claude Code 干活

Claude Code 实用指南:AI 编程助手的核心功能与使用技巧 Claude Code 是 Anthropic 推出的智能编程助手,可直接在本地环境中执行操作,相比传统 AI 对话工具具有显著优势:能直接读取项目文件、自动执行修改、记忆项目规则,并支持连接外部服务。本文详解其安装配置、三大核心场景(资料搜索、网页抓取、文章撰写)及进阶功能(Skills、MCP协议、斜杠命令)。特别提供了工作模式切换、CLAUDE.md配置文件等实用技巧,并附常见问题解决方案,帮助用户高效利用这一"坐在身边的

2401_84052244的博客 7428

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

管理订单状态,一定要用上状态机吗?

大家好,我是不才陈某~在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值。去年笔者进入了电商领域从事后端开发。电商领域,状态又多又复杂,如果仍然在业务代码中东一块西一块维护状态值,很容易陷入出了问题难于Debug,难于追责的窘境。Java进阶网站:https://java-fam...

码猿技术专栏 332

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Cola-StateMachine 状态机

比如说从文章从待发布变为已发布的状态变化业务,其实对于使用状态机来说,就是通过状态机的service调用事件,事件是什么?就是状态变换对应的操作,有点绕?不急,你这样理解:比如发布文章,那就是一个事件。我发布文章那就对应状态从待发布变为已发布,这就是状态机。我发现,所有的状态机文章都是先给你上来讲状态机背景、选择、原理、概念、图例等等等等。就是没人讲状态机的理解。这样画明白了吧,其实很简单,不要想的很复杂。

GSL_566的博客 263

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

超强COLA状态机:多状态并发处理新范式

你还在为状态机并行处理烦恼吗?一文掌握COLA框架的多状态并发解决方案。读完本文你将获得: - 理解COLA状态机并行处理核心机制 - 掌握fireParallelEvent方法实战应用 - 学会使用externalParallelTransition构建并行状态流 ## 并行状态处理痛点与解决方案 在复杂业务场景中,常常需要同时处理多个独立状态流。传统状态机往往只能线性处理状态转换,难以满足...

gitblog_01023的博客 454

从崩溃到自愈:COLA状态机错误恢复机制的设计与实践

订单支付超时、物流状态异常、会员等级更新失败——这些业务中断场景的背后,往往是状态机(State Machine)在处理复杂状态流转时遭遇的异常。在COLA(Clean Object-oriented & Layered Architecture)架构中,状态机组件作为业务流程的核心引擎,其稳定性直接决定了系统的可靠性。当状态机从"待支付"跃迁到"已取消"失败时,不仅会导致订单数据不一致,更可能引...

gitblog_00499的博客 485

终极指南:COLA状态机如何保障多线程状态一致性

你是否曾在多线程环境中遭遇状态混乱、数据不一致的难题?当多个线程同时操作状态机时,如何确保状态流转的准确性和一致性?本文将深入解析COLA框架中状态机组件的并发控制机制,通过实战案例和代码示例,带你掌握多线程环境下状态一致性的保障措施。读完本文,你将能够: - 理解COLA状态机的核心设计与工作原理 - 识别多线程状态管理的常见陷阱与解决方案 - 掌握COLA状态机并发控制的三种关键技术 - 运用...

gitblog_00534的博客 810
上一篇: RabbitMQ报错: Shutdown Signal: channel error
下一篇: Seata Client 2.0 无法提示业务异常信息问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值