import com.alibaba.cola.statemachine.StateMachine;
import com.alibaba.cola.statemachine.builder.StateMachineBuilder;
import com.alibaba.cola.statemachine.builder.StateMachineBuilderFactory;
import lombok.Data;
import lombok.Getter;
/**
* 测试cola状态机驱动
*
* @author ext.niehuibin1
* @date 2025/5/15 11:08
*/
public class TestColaStateMachina {
//
// <dependency>
// <groupId>com.alibaba.cola</groupId>
// <artifactId>cola-component-statemachine</artifactId>
// <version>4.2.0</version>
// </dependency>
/** 状态机id */
public static final String MACHINE_ID = "mba";
public static void main(String[] args) {
MbaContext mbaContext = new MbaContext();
// mbaContext.setScore(80.0);
runStateMachine(MbaState.EXAM_FIRST_PENDING, MbaEvents.FIRST_EXAM, mbaContext);
}
private static void runStateMachine(MbaState initState, MbaEvents event, MbaContext context) {
// 第一步:生成一个状态机builder
StateMachineBuilder<MbaState, MbaEvents, MbaContext> builder =
StateMachineBuilderFactory.create();
// 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform
builder
.externalTransition()
.from(MbaState.EXAM_FIRST_PENDING)
.to(MbaState.EXAM_SECOND_PENDING)
.on(MbaEvents.FIRST_EXAM)
.when(ctx -> ctx.getScore() >= 60.0)
.perform((from, to, e, ctx) -> System.out.println("初试通过"));
builder
.externalTransition()
.from(MbaState.EXAM_FIRST_PENDING)
.to(MbaState.EXAM_FIRST_FAILED)
.on(MbaEvents.FIRST_EXAM)
.when(ctx -> ctx.getScore() < 60.0)
.perform((from, to, e, ctx) -> System.out.println("初试不通过"));
builder
.externalTransition()
.from(MbaState.EXAM_SECOND_PENDING)
.to(MbaState.IN_WAITLIST)
.on(MbaEvents.SECOND_EXAM)
.when(ctx -> ctx.getScore() >= 80.0)
.perform((from, to, e, ctx) -> System.out.println("复试通过"));
builder
.externalTransition()
.from(MbaState.EXAM_SECOND_PENDING)
.to(MbaState.EXAM_SECOND_FAILED)
.on(MbaEvents.SECOND_EXAM)
.when(ctx -> ctx.getScore() < 80.0)
.perform((from, to, e, ctx) -> System.out.println("复试不通过"));
// 第三步:设置状态机的id和ready,并在StateMachineFactory中的stateMachineMap进行注册
StateMachine<MbaState, MbaEvents, MbaContext> stateMachine = builder.build(MACHINE_ID);
// 第四步:触发状态机
MbaState target = stateMachine.fireEvent(initState, event, context);
System.out.println(target);
}
}
enum MbaState {
EXAM_FIRST_PENDING("待初试"),
EXAM_FIRST_FAILED("初试不通过"),
EXAM_SECOND_PENDING("待复试"),
EXAM_SECOND_FAILED("复试不通过"),
IN_WAITLIST("待录取"),
;
@Getter private String message;
MbaState(String message) {
this.message = message;
}
}
enum MbaEvents {
FIRST_EXAM("初试"),
SECOND_EXAM("复试"),
FINAL_EXAM("终试"),
;
@Getter private String message;
MbaEvents(String message) {
this.message = message;
}
}
@Data
class MbaContext {
/** 考试分数 */
private double score;
/** 考试结果 */
private Boolean result;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。