弹簧状态机设置多个初始状态

时间:2018-08-06 11:18:03

标签: spring state-machine

我的订单状态类似

 public enum orderStateEnum {
        STATE_UNUSED("UNUSED"),
        STATE_ORDERED("ORDERED"),
        STATE_ASSIGNED("ASSIGNED"),
        STATE_ASSIGN_EXCEPTION("ASSIGN_EXCEPTION"),
        STATE_PACKED("PACKED"),
        //and so on
    }

并且我想使用spring.statemachine(或其他状态机实现)来管理从STATE_UNUSED to STATE_ORDERED STATE_ORDERED to STATE_ASSIGNED STATE_ORDERED to STATE_ASSIGN_EXCEPTION STATE_ASSIGNED to STATE_PACKED开始的过渡,但是所有订单数据都存储在数据库中,所以在我的情况下,如果我有一个订单 STATE_ASSIGNED 状态,我从数据库中获取订单状态,但是在spring.statemachine中,我必须执行StateMachine stateMachine = new StateMachine(); stateMachine.createEvent(Event_take_order);

当我新建stateMachine实例时,其初始状态为 STATE_UNUSED ,但是我希望初始状态为从数据库中获取的状态,即状态 STATE_ASSIGNED ,我该如何实现?我已经读过[https://docs.spring.io/spring-statemachine/docs/1.0.0.BUILD-SNAPSHOT/reference/htmlsingle/],但找不到任何解决方案。

1 个答案:

答案 0 :(得分:0)

创建新的StateMachine时,可以使用stateMachine.getStateMachineAccessor()获取StateMachineAccessor

StateMachineAccessor是:- StateMachine的功能接口,允许对底层功能进行更多的编程访问。前缀为“ doWith”的函数将通过StateMachineFunction公开StateMachineAccess,以便使用jdk7进行更好的功能访问。前缀为“ with”的函数更适合于lambda。(来自Java Docs)

StateMachineAccessor有一个名为doWithAllRegions的方法,您可以在其中提供StateMachineFunction(接口)的实现,而doWithAllRegions将在所有递归区域中执行给定的StateMachineFunction。

因此,要实现您要尝试执行的代码,将如下所示:-

public sealed class SecondPermissionFilterAttribute : Attribute
{
    private readonly PermissionEnum _requestedPermission;
    private readonly IEnumerable<AccessLevelEnum> _accessLevelCollection;
    private readonly IHttpContextAccessor _contextAccessor; //<-- how to inject?

    public PermissionFilterAttribute(PermissionEnum requestedPermission, params AccessLevelEnum[] accessLevelCollection)
    {
        _requestedPermission = requestedPermission;
        _accessLevelCollection = accessLevelCollection;
    }
}

我提供了使用lambda的接口实现。