一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

状态机联动方法和装置与流程

2021-12-07 20:10:00 来源:中国专利 TAG:


1.本发明涉及计算机技术领域,尤其涉及一种状态机联动方法和装置。


背景技术:

2.有限状态机(finite state machine,fsm)简称状态机,是一种表示有限状态以及在这些状态之间的转移、动作等行为的数学模型。一般情况下,有限状态机通过状态、事件和动作之间的关系来控制状态转移。利用状态机模型处理业务中的状态转移,能够更清晰的以状态拓扑图的方式看清状态流转过程,能够避免代码中过多繁琐的if/else逻辑控制语句,使得代码易于维护。
3.现有的状态机实现方法一般为以下流程:首先,将业务流程中涉及的所有状态定义为状态机的状态;之后,确定状态机的当前状态,根据状态机的当前状态和接收的事件来确定下一个状态以及对应的动作,根据这些信息控制状态机从当前状态跳转至下一个状态,并执行对应的动作。
4.在实现本发明的过程中,发明人发现现有技术至少存在以下问题:现有的状态机实现流程一般基于一套状态转移拓扑进行程序设计,无法满足不同状态机状态转移联动的场景。例如,某项目的状态转移会导致关联项目的状态也发生转移。此外,对于业务对象数据量较大的场景,现有技术需要频繁的创建状态机,由此过多地消耗了系统资源。


技术实现要素:

5.有鉴于此,本发明实施例提供一种状态机联动方法和装置,能够实现不同状态机实例之间的状态转移联动。
6.为实现上述目的,根据本发明的一个方面,提供了一种状态机联动方法。
7.本发明实施例的状态机联动方法包括:接收指向第一状态机实例的第一状态转移消息;其中,第一状态转移消息中携带有第一状态机实例对应的业务对象的标识、以及用于指示第一状态机实例进行状态转移的第一事件;依据第一事件对第一状态机实例进行状态转移,执行对应于该状态转移的预设动作,基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更;基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,以使第二状态机实例进行状态转移;其中,第二状态转移消息中携带有第二状态机实例对应的业务对象的标识、以及用于指示第二状态机实例进行状态转移的第二事件。
8.可选地,所述动作包括:退出前一状态的第一公共动作、进入后一状态的第二公共动作以及对应于状态转移的特定动作;以及,所述执行对应于该状态转移的预设动作,包括:在接收第一状态转移消息之后,执行第一事件对应的消息拦截器定义的进入方法和第一公共动作;在第一状态机实例进行状态转移之后,执行第二公共动作、所述特定动作和所述消息拦截器定义的退出方法。
9.可选地,所述特定动作中包括:用于对业务对象的状态进行变更的第一方法;以
及,所述基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更,包括:使用第一状态转移消息中携带的业务对象标识确定相应的业务对象;执行第一方法对确定的业务对象的状态进行变更。
10.可选地,所述特定动作中包括:用于发送状态转移消息的第二方法;以及,所述基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,包括:执行第二方法使第一状态机实例向第二状态机实例发送第二状态转移消息。
11.可选地,第一状态机实例和第二状态机实例中的任一状态机实例根据以下步骤获取:判断预设的持久化存储单元中是否存在对应于业务对象的状态机数据:若是,将该状态机数据反序列化到内存中,形成状态机实例。
12.可选地,第一状态机实例和第二状态机实例中的任一状态机实例根据以下步骤获取:判断设置在内存的对象池中是否存在对应于业务对象的状态机实例:若是,从所述对象池中调用该状态机实例,并将该状态机实例的当前状态调整为与该业务对象的当前状态一致的状态;以及,所述状态机联动方法进一步包括:在对该状态机实例的使用完毕之后,将该状态机实例返回到所述对象池。
13.为实现上述目的,根据本发明的另一方面,提供了一种状态机联动装置。
14.本发明实施例的状态机联动装置可包括:接收单元,用于接收指向第一状态机实例的第一状态转移消息;其中,第一状态转移消息中携带有第一状态机实例对应的业务对象的标识、以及用于指示第一状态机实例进行状态转移的第一事件;业务对象变更单元,用于:依据第一事件对第一状态机实例进行状态转移,执行对应于该状态转移的预设动作,基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更;联动单元,用于:基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,以使第二状态机实例进行状态转移;其中,第二状态转移消息中携带有第二状态机实例对应的业务对象的标识、以及用于指示第二状态机实例进行状态转移的第二事件。
15.可选地,所述动作包括:退出前一状态的第一公共动作、进入后一状态的第二公共动作以及对应于状态转移的特定动作;以及,业务对象变更单元进一步用于:在接收第一状态转移消息之后,执行第一事件对应的消息拦截器定义的进入方法和第一公共动作;在第一状态机实例进行状态转移之后,执行第二公共动作、所述特定动作和所述消息拦截器定义的退出方法。
16.为实现上述目的,根据本发明的又一方面,提供了一种电子设备。
17.本发明的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明所提供的状态机联动方法。
18.为实现上述目的,根据本发明的再一方面,提供了一种计算机可读存储介质。
19.本发明的一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明所提供的状态机联动方法。
20.根据本发明的技术方案,上述发明中的实施例具有如下优点或有益效果:预先在状态机实例中设置消息封装及发送功能,当某状态机实例接收到状态转移消息进而进行状
态转移时,在执行对应于该状态转移的预设动作对相应的业务对象状态进行变更之余,执行该预设动作使该状态机实例向与该状态机实例关联的状态机实例发送另一状态转移消息,从而使关联的状态机实例也执行状态转移,由此实现任意多个状态机实例的状态转移联动,满足了业务对象之间状态转移联动的业务场景。另外,在获取状态机实例时,本发明实施例除直接创建的方式之外,还可以使用在持久化存储单元预存的、与业务对象一一对应的状态机数据,将该状态机数据反序列化即可形成状态机实例,或者,调用内存对象池中预存的状态机实例,将该状态机实例的当前状态与业务对象当前状态调整为一致,以此形成需要的状态机实例,使用这两种方式能够减少对状态机实例的频繁创建,消除创建、回收对象产生的内存、cpu(central processing unit,中央处理器)以及网络开销。
21.上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
22.附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
23.图1是本发明实施例中状态机联动方法的主要步骤示意图;
24.图2是本发明实施例中状态机实例的状态转移整体流程示意图;
25.图3是本发明实施例中状态机实例创建的uml(unified modeling language,统一建模语言)示意图;
26.图4是本发明实施例中状态机实例接收事件的步骤示意图;
27.图5是本发明实施例中状态机实例的状态转移流程示意图;
28.图6是本发明实施例中状态机实例的联动示意图;
29.图7是本发明实施例中状态机联动装置的组成部分示意图;
30.图8是根据本发明实施例可以应用于其中的示例性系统架构图;
31.图9是用来实现本发明实施例中状态机联动方法的电子设备结构示意图。
具体实施方式
32.以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
33.需要指出的是,在不冲突的情况下,本发明的实施例以及实施例中的技术特征可以相互结合。
34.图1是根据本发明实施例中状态机联动方法的主要步骤示意图。
35.如图1所示,本发明实施例的状态机联动方法可具体按照如下步骤执行:
36.步骤s101:接收指向第一状态机实例的第一状态转移消息。
37.在本步骤中,存储有多个状态机实例的服务端接收第一状态转移消息,第一状态转移消息指向第一状态机实例,即第一状态转移消息是消息发送方向第一状态机实例发送的。第一状态转移消息中可以携带第一状态机实例对应的业务对象的标识、以及用于指示第一状态机实例进行状态转移的第一事件。其中,第一状态机实例可以是服务端存储的任
一状态机实例;第一状态转移消息中携带的业务对象标识可用于确定第一状态机对应的业务对象;第一事件可依据预先设置的转移逻辑实现第一状态机实例的某种方式的状态转移。以下首先说明有限状态机的相关概念。
38.在本发明实施例中,有限状态机可以通过状态(state)、事件(event)和动作(action)之间的关系来控制状态的转移,其中,状态指对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者等待某些事件。事件在时间和空间上占有一定位置,并且对于有限状态机(简称为状态机)来说具有特定意义,事件通常会引起状态的变迁,促使状态机从一种状态转移到另一种状态。动作是指状态机中可以执行的原子操作(即不会被线程调度机制打断的操作)。
39.实际应用中,不同的业务对象(例如订单、项目等)往往可以抽象为相应的状态机实例,例如,在项目管理领域,主项目是较长时期内的项目,包含多个子项目,主项目与子项目可以作为相互关联的业务对象。主项目可以抽象为具有状态a、b、c的状态机实例1,子项目可以抽象为具有状态a、b、d的状态机实例2,状态a、b、c、d可以对应等待招标、招标中、招标完成等实际状态。这两个状态机实例具有不同的状态转移拓扑(状态转移拓扑包括:状态机实例的所有状态、所有状态转移方式以及状态转移方式对应的事件、动作等,可以使用图或表的方式描述),下表即为主项目对应的状态机实例1的状态转移拓扑,其中第一列表示前一状态,第一行表示后一状态。
[0040][0041]
根据上表,当发生event1时,状态机实例1保持在状态a,执行action1;当发生event2时,触发状态机实例1从状态a转移到状态b,并执行action2;当发生event3时,触发状态机实例1从状态a转移到状态c,并执行action3。具体应用中,一个事件也可以绑定多个状态转移方式,当接收到某一事件时,可以根据状态机实例的当前状态从该事件绑定的状态转移方式中确定相应的一种状态转移方式。
[0042]
在实际场景中,主项目与子项目的状态转移往往具有联动的特点,例如,当主项目从状态a转移到状态b时,子项目也需要从状态a转移到状态b,因此,对应的状态机实例1和状态机实例2也需要模拟这种特点。现有技术中,只能基于单独的某一状态机实例实现状态转移逻辑,无法执行不同状态机实例之间状态转移的联动,针对以上缺陷,本发明实施例即提供支持不同状态机实例进行状态转移联动的方法。
[0043]
在步骤s101中,服务端接收客户端发送的第一状态转移消息,其中,客户端指的是消息发送方,客户端可以与服务端处于同一系统或同一主机,也可以与服务端处于不同的系统或主机。
[0044]
步骤s102:依据第一事件对第一状态机实例进行状态转移,执行对应于该状态转移的预设动作,基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状
态进行变更。
[0045]
在本步骤中,服务端在接收到指向第一状态机实例的第一状态转移消息之后,根据第一状态转移消息中携带的第一事件对第一状态机实例进行相应的状态转移,并在状态转移之前、之后或同时,执行对应于该状态转移的预设动作。较佳地,在本发明实施例中,上述预设动作包括:退出前一状态的第一公共动作、进入后一状态的第二公共动作以及对应于该状态转移的特定动作。其中,第一公共动作和第二公共动作是每一种状态转移方式均具有的动作,例如,上例中状态机实例1的每一种状态转移方式(包括从状态a转移到状态b、从状态b转移到状态c、从状态c转移到状态b等)都具有相同的第一公共动作和第二公共动作。特定动作与公共动作相对而言,指的是仅对应于当前状态转移方式的动作,每种状态转移方式对应的特定动作一般是不同的。
[0046]
这样,步骤s102中执行预设动作的具体方式可以如下:服务端在接收第一状态转移消息之后,执行第一公共动作;在第一状态机实例进行对应于第一时间的状态转移之后,执行第二公共动作和特定动作。承接上例,服务端在接收到“到达招标截止时间”的第一事件(第一事件对应于状态机实例1从状态a转移到状态b的状态转移方式)之后,在状态机实例1中执行第一公共动作“计算项目完成度”;在状态机实例1进行状态转移之后,执行第二公共动作“获取当前的项目数据”和特定动作“请求算法服务执行对应于状态b的相关计算”。
[0047]
作为一个优选方案,本发明实施例还可以预先配置对应于每一事件的消息拦截器,以便在接收到消息和事件之后执行消息拦截器预先定义的方法,以实现自定义的计算逻辑。配置了消息拦截器之后,步骤s102中执行预设动作的具体方式可以如下:服务端在接收第一状态转移消息之后,执行第一事件对应的消息拦截器定义的进入方法和第一公共动作;在第一状态机实例进行状态转移之后,依次执行第二公共动作、上述特定动作和消息拦截器定义的退出方法。承接上例,消息拦截器定义的进入方法可以是“记录系统日志和项目当前状态”,消息拦截器定义的退出方法可以是“获取请求算法参数”。
[0048]
在步骤s102中,在第一状态机实例进行状态转移之后,服务端还可以基于上述预设动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更。具体地,上述特定动作中可以包括用于对业务对象的状态进行变更的第一方法,则服务端可以首先使用第一状态转移消息中携带的业务对象标识确定相应的业务对象,再通过执行第一方法对确定的业务对象的状态进行相应变更。实际应用中,业务对象的具体数据可以存储在数据库中,因此变更业务对象的操作可以在数据库中执行。可以理解,该变更方式与第一状态机实例的状态转移方式保持一致。通过以上设置,本发明实施例能够基于有限状态机实现响应于外部事件的业务对象状态自动变更。
[0049]
步骤s103:基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,以使第二状态机实例进行状态转移。
[0050]
在本发明实施例中,可以预先为各状态机实例增加客户端功能,即消息封装和发送功能,这样服务端在执行上述预设动作时,第一状态机实例能够向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,从而使第二状态机实例进行状态转移,由此实现第一状态机实例与第二状态机实例的状态转移联动。第二状态转移消息中的数据与第一状态转移消息类似,可以包括第二状态机实例对应的业务对象的标识以及用于指示第二
状态机实例进行状态转移的第二事件。
[0051]
具体地,上述特定动作中可以包括用于发送状态转移消息的第二方法,执行状态转移联动的方式可以是:服务端执行特定动作中的第二方法,使第一状态机实例向第二状态机实例发送第二状态转移消息,第二状态机实例接收到第二状态转移消息之后,基于其中携带的第二事件进行相应的状态转移,并根据第二状态转移消息中业务对象标识确定相应的业务对象,以及在数据库中执行预设动作更改该业务对象的状态。可以理解,第二状态机实例还可以通过类似于第一状态机实例的方式向与第二状态机实例关联的第三状态机实例发送状态转移消息,以使第三状态机实例执行状态转移,第三状态机实例在执行状态转移之余可以向与之关联的第四状态机实例发送状态转移消息,以使第四状态机实例执行状态转移
……
,这样,即可实现任意多个状态机实例的状态转移联动,从而克服了现有技术中只能针对单个状态机实例进行程序设计的缺陷。
[0052]
可以理解,步骤s103执行于步骤s102中“依据第一事件对第一状态机实例进行状态转移”之后,同时可以执行于步骤s102中“基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更”之前、之后或同时。
[0053]
在本发明实施例中,还提供了新的状态机实例获取方法以解决现有状态机实例获取方法中存在的问题。现有技术中,当需要获取业务对象对应的状态机实例时,一般采用直接创建状态机实例的方式,使用完毕之后即将状态机实例直接销毁,由此造成较大的内存、cpu及网络开销。本发明提供以下两种状态机实例获取方式。
[0054]
其一,当对状态机实例的使用完毕之后,将与业务对象一一对应的状态机数据(即状态机实例序列化形成的数据,该状态机数据也与业务对象当前状态保持一致)存储在预设的持久化存储单元(如缓存或硬盘);当需要获取业务对象对应的状态机实例时,判断持久化存储单元中是否存在对应于业务对象的状态机数据(可以理解,每一状态机实例在创建时均会通过配置业务对象标识实现与相应业务对象的绑定,上述判断可以通过检测状态机数据中的业务对象标识来实现),如果持久化存储单元中存在对应于业务对象的状态机数据,则可以将该状态机数据反序列化到内存中,从而形成状态机实例。在计算机技术领域,序列化指的是把数据对象转换为字节序列的过程,反序列化指的是把字节序列恢复为数据对象的过程。
[0055]
其二,在历史时期创建状态机实例之后,可将状态机实例存储在内存中的对象池。一般地,存储在对象池的状态机实例处在最初状态(即创建状态机实例之后状态机实例所处的状态),能够对各业务对象提供复用。当需要获取业务对象对应的状态机实例时,可以首先判断对象池中是否存在对应于业务对象的状态机实例:若是,从对象池中调用该状态机实例,并将该状态机实例的当前状态调整为与该业务对象的当前状态一致的状态,即可得到可用的状态机实例。在以上方式中,对该状态机实例的使用完毕之后,可以将该状态机实例归还到对象池。
[0056]
以上两种状态机获取方式都可以消除因频繁创建、销毁状态机实例产生的内存、cpu及网络的巨大开销,减轻系统压力。
[0057]
以下将根据一个具体实施例进一步说明本发明的技术方案。
[0058]
本实施例应用在项目管理场景中,通过建立状态机来控制各项目的状态转移。具体地,项目存在主、子关系,主项目和子项目具有各自的状态、事件、状态转移拓扑及状态转
移前后执行的动作。进一步地,主项目与子项目的状态转移拓扑存在联动关系,主项目发生了某种状态转移会导致子项目发生状态转移,反之亦然。目前的状态机实现方式无法满足上述多套状态转移拓扑之间存在联动的业务场景。图2示出了本实施例中状态机实例的状态转移整体流程。
[0059]
在利用状态机实例执行业务对象的状态转移之前预先需要进行如下配置。
[0060]
配置1:根据业务场景定义状态机实例的状态和事件枚举,并将状态机实例绑定相应的业务对象标识。
[0061]
配置2:构建状态机创建模块,状态机创建模块采用工厂模式加策略模式的设计模式,结构如图3所示。其中,每个statemachinebuilder维护单独的一套状态转移拓扑,状态转移拓扑可以包括:状态机的各种状态、状态机接收事件后的状态转移方式及对应的特定动作、状态机进入任一状态或退出任一状态的公共动作、状态机接收事件后由某一状态转移到另一状态的判断条件(根据该判断条件可以判断状态机实例是进入到某一状态还是停留在原始状态,该判断条件也可以不配置)。在图3中,不同的statemachinebuilder类具有同一个接口方法build(),执行该方法可以将状态转移拓扑包含的数据作为属性配置并且实例化。当spring容器启动时,每个statemachinebuilder实例化后注入到spring容器中,此后通过自定义工厂statemachinefactory传入状态转移拓扑类型(可以利用getbuilder(type)方法获取状态转移拓扑类型,不同的状态转移拓扑即属于不同的状态转移拓扑类型),并从spring容器中获取对应的statemachinebuilder。statemachinefactory暴露给客户端一个create()接口,使用该接口可以基于状态转移拓扑类型从spring容器中获取statemachinebuilder对象,再调用其build()方法,从而完成状态机的配置和实例化。
[0062]
配置3:配置对应于事件的消息拦截器,并定义相应的进入方法和退出方法。
[0063]
配置4:构建状态机持久化模块用于状态机实例的存储和获取。在本实施例中,可以为每个业务对象对应一个状态机实例,当业务对象进入任一状态时可以将状态机实例存储在持久化存储单元,此时业务对象与状态机实例的状态是一致的。当业务对象再次被调用时,可以从持久化存储单元中直接恢复状态机实例,以替代重新创建状态机的过程,从而快速得到可用的状态机实例。
[0064]
以下结合图2说明状态机实例的状态转移整体流程。
[0065]
首先,输入业务对象、业务类型等业务数据,并判断在后续流程中是否需要对状态机实例持久化。如果需要,则使用状态机持久化模块来获取状态机实例,即判断持久化存储单元中是否存在对应于业务对象的状态机数据,如果存在,则将状态机数据反序列化为状态机实例直接使用;如果不存在,则使用状态机创建模块创建状态机实例。
[0066]
如果判断在后续流程中不需要对状态机实例持久化,则进一步判断是否维护对象池。如果存在对象池,则从对象池中获取业务对象对应的状态机实例并执行状态匹配;如果不存在对象池,则使用状态机创建模块创建状态机实例。上述状态匹配指的是:对于使用状态机创建模块创建的状态机实例以及从对象池中获取的状态机实例,将该状态机实例的当前状态调整为与业务对象当前状态相一致的状态,经过状态匹配之后,同样可以得到可用的状态机实例。
[0067]
此后,状态机实例可以根据客户端发送的事件信号进行状态转移。状态机实例使用完毕之后,可以使用状态机持久化模块将状态机实例存储在持久化存储单元以供后续使
用。如果此前状态机实例是从对象池中获取的,则在状态机实例使用完毕之后,需要将状态机实例归还到对象池。
[0068]
在以上流程中,利用持久化存储单元及对象池维护与获取状态机实例都能够有效避免对状态机实例的重复创建和销毁。持久化方式能够快速恢复具有存储时状态的可用状态机实例,对象池中的状态机实例对各业务对象提供复用,使用者可以从对象池中取得具有最初状态的状态机实例,并在工作完成后将其归还到对象池而非直接销毁。基于这两种方式,状态机实例内部所维护的状态转移拓扑、相应动作、判断条件等都能够得到快速的恢复,当业务场景中存在大量业务对象需要并发处理时,可以采用这两种方式避免创建过多对象导致内存激增,有效保证系统稳定性。
[0069]
在本实施例中,得到可用的状态机实例之后,客户端可以向状态机实例发送事件。状态机实例根据状态转移拓扑中绑定的事件和状态转移方式切换到下一状态,并且执行相关的动作。图4是本发明实施例中状态机实例接收事件的步骤示意图,如图4所示,事件和业务对象数据(包括业务对象标识)被整体封装成一个消息体结构(即状态转移消息)传入状态机实例,状态机实例接收到状态转移消息后将其中携带的事件放入消息队列中。然后,状态机实例可以根据执行状态转移方法的复杂度和执行时间采用同步线程或异步线程的方式对消息队列中的消息进行消费(可以是提交至事件处理线程进行处理)。整个消费过程如图5所示。
[0070]
参见图5,首先,根据配置3中的消息拦截器,执行消息拦截器定义的进入方法pretransition()。接着,状态机实例执行预先设定的转移条件判断方法guard()进行状态转移评估,如果该方法返回true则评估通过,继续执行状态转移过程。若评估结果为false则退出状态转移流程。此后,状态机实例根据配置2中的数据获取退出前一状态的第一公共动作afterstateaction()、进入后一状态的第二公共动作beforestateaction()以及对应于当前状态转移的特定动作action(),并在状态转移之前执行afterstateaction(),在状态转移之后依次执行beforestateaction()和action(),action()中可以包括前述第一方法和第二方法。通过执行第一方法能够对数据库中的业务对象状态进行变更,以其与状态机实例的当前状态相一致,通过执行第二方法能够使第一状态机实例向第二状态机实例发送第二状态转移消息,以实现不同状态机实例的状态转移联动。最后,执行消息拦截器定义的退出方法posttransition()。
[0071]
图6示出了本实施例中状态机实例的联动。如图6所示,每一状态机实例内部持有相应的业务对象并处于某一状态。当状态机实例a接收到客户端发送的事件e1时,在执行相应的状态转移(从状态s1到状态s2)及更改业务对象状态之余,使用嵌入的消息封装和发送功能向状态机b发送事件e2,状态机实例b在接收到e2时,在执行相应的状态转移(从状态s3到状态s4)及更改业务对象状态之余,向状态机c发送事件e3
……
,从而实现具有关联关系的多个状态机实例的状态转移联动。
[0072]
在本发明实施例的技术方案中,预先在状态机实例中设置消息封装及发送功能,当某状态机实例接收到状态转移消息进而进行状态转移时,在执行对应于该状态转移的预设动作对相应的业务对象状态进行变更之余,执行该预设动作使该状态机实例向与该状态机实例关联的状态机实例发送另一状态转移消息,从而使关联的状态机实例也执行状态转移,由此实现任意多个状态机实例的状态转移联动,满足了业务对象之间状态转移联动的
业务场景。另外,在获取状态机实例时,本发明实施例除直接创建的方式之外,还可以使用在持久化存储单元预存的、与业务对象一一对应的状态机数据,将该状态机数据反序列化即可形成状态机实例,或者,调用内存对象池中预存的状态机实例,将该状态机实例的当前状态与业务对象当前状态调整为一致,以此形成需要的状态机实例,使用这两种方式能够减少对状态机实例的频繁创建,消除创建、回收对象产生的内存、cpu以及网络开销。
[0073]
可以理解的是,以上示例仅为说明本发明技术方案,并不一定与真实场景严格对应。
[0074]
需要说明的是,对于前述的各方法实施例,为了便于描述,将其表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,某些步骤事实上可以采用其它顺序进行或者同时进行。此外,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是实现本发明所必须的。
[0075]
为便于更好的实施本发明实施例的上述方案,下面还提供用于实施上述方案的相关装置。
[0076]
请参阅图5所示,本发明实施例提供的状态机联动装置700可以包括:接收单元701、业务对象变更单元702和联动单元703。
[0077]
其中,接收单元701可用于接收指向第一状态机实例的第一状态转移消息;其中,第一状态转移消息中携带有第一状态机实例对应的业务对象的标识、以及用于指示第一状态机实例进行状态转移的第一事件;业务对象变更单元702可用于:依据第一事件对第一状态机实例进行状态转移,执行对应于该状态转移的预设动作,基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更;联动单元703可用于:基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,以使第二状态机实例进行状态转移;其中,第二状态转移消息中携带有第二状态机实例对应的业务对象的标识、以及用于指示第二状态机实例进行状态转移的第二事件。
[0078]
在本发明实施例中,所述动作可包括:退出前一状态的第一公共动作、进入后一状态的第二公共动作以及对应于状态转移的特定动作;以及,业务对象变更单元702可进一步用于:在接收第一状态转移消息之后,执行第一事件对应的消息拦截器定义的进入方法和第一公共动作;在第一状态机实例进行状态转移之后,执行第二公共动作、所述特定动作和所述消息拦截器定义的退出方法。
[0079]
作为一个优选方案,所述特定动作中可包括:用于对业务对象的状态进行变更的第一方法;以及,业务对象变更单元702可进一步用于:使用第一状态转移消息中携带的业务对象标识确定相应的业务对象;执行第一方法对确定的业务对象的状态进行变更。
[0080]
较佳地,所述特定动作中可包括:用于发送状态转移消息的第二方法;以及,联动单元703可进一步用于:执行第二方法使第一状态机实例向第二状态机实例发送第二状态转移消息。
[0081]
实际应用中,所述装置700可进一步包括第一状态机实例恢复单元,其可用于:判断预设的持久化存储单元中是否存在对应于业务对象的状态机数据:若是,将该状态机数据反序列化到内存中,形成状态机实例。
[0082]
此外,在本发明实施例中,所述装置700可进一步包括第二状态机实例恢复单元,
其可用于:判断设置在内存的对象池中是否存在对应于业务对象的状态机实例:若是,从所述对象池中调用该状态机实例,并将该状态机实例的当前状态调整为与该业务对象的当前状态一致的状态;以及,所述装置700可进一步包括状态机实例归还单元,其可用于:在对该状态机实例的使用完毕之后,将该状态机实例返回到所述对象池。
[0083]
在本发明实施例的技术方案中,预先在状态机实例中设置消息封装及发送功能,当某状态机实例接收到状态转移消息进而进行状态转移时,在执行对应于该状态转移的预设动作对相应的业务对象状态进行变更之余,执行该预设动作使该状态机实例向与该状态机实例关联的状态机实例发送另一状态转移消息,从而使关联的状态机实例也执行状态转移,由此实现任意多个状态机实例的状态转移联动,满足了业务对象之间状态转移联动的业务场景。另外,在获取状态机实例时,本发明实施例除直接创建的方式之外,还可以使用在持久化存储单元预存的、与业务对象一一对应的状态机数据,将该状态机数据反序列化即可形成状态机实例,或者,调用内存对象池中预存的状态机实例,将该状态机实例的当前状态与业务对象当前状态调整为一致,以此形成需要的状态机实例,使用这两种方式能够减少对状态机实例的频繁创建,消除创建、回收对象产生的内存、cpu以及网络开销。
[0084]
图8示出了可以应用本发明实施例的状态机联动方法或状态机联动装置的示例性系统架构800。
[0085]
如图8所示,系统架构800可以包括终端设备801、802、803,网络804和服务器805(此架构仅仅是示例,具体架构中包含的组件可以根据申请具体情况调整)。网络804用以在终端设备801、802、803和服务器805之间提供通信链路的介质。网络804可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等。
[0086]
用户可以使用终端设备801、802、803通过网络804与服务器805交互,以接收或发送消息等。终端设备801、802、803上可以安装有各种客户端应用,例如消息发送应用(仅为示例)。
[0087]
终端设备801、802、803可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
[0088]
服务器805可以是提供各种服务的服务器,例如对用户利用终端设备801、802、803所操作的消息发送应用提供支持的运算服务器(仅为示例)。运算服务器可以接收终端设备801、802、803发送的状态转移消息,并根据状态转移消息对设置在运算服务器的状态机实例进行状态转移。
[0089]
需要说明的是,本发明实施例所提供的状态机联动方法一般由服务器805执行,相应地,状态机联动装置一般设置于服务器805中。
[0090]
应该理解,图8中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
[0091]
本发明还提供了一种电子设备。本发明实施例的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明所提供的状态机联动方法。
[0092]
下面参考图9,其示出了适于用来实现本发明实施例的电子设备的计算机系统900的结构示意图。图9示出的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0093]
如图9所示,计算机系统900包括中央处理单元(cpu)901,其可以根据存储在只读存储器(rom)902中的程序或者从存储部分908加载到随机访问存储器(ram)903中的程序而执行各种适当的动作和处理。在ram903中,还存储有计算机系统900操作所需的各种程序和数据。cpu901、rom 902以及ram 903通过总线904彼此相连。输入/输出(i/o)接口905也连接至总线904。
[0094]
以下部件连接至i/o接口905:包括键盘、鼠标等的输入部分906;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分907;包括硬盘等的存储部分908;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分909。通信部分909经由诸如因特网的网络执行通信处理。驱动器910也根据需要连接至i/o接口905。可拆卸介质911,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器910上,以便从其上读出的计算机程序根据需要被安装入存储部分908。
[0095]
特别地,根据本发明公开的实施例,上文的主要步骤图描述的过程可以被实现为计算机软件程序。例如,本发明实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行主要步骤图所示的方法的程序代码。在上述实施例中,该计算机程序可以通过通信部分909从网络上被下载和安装,和/或从可拆卸介质911被安装。在该计算机程序被中央处理单元901执行时,执行本发明的系统中限定的上述功能。
[0096]
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd

rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。在本发明中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。
[0097]
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这根据所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行
规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0098]
描述于本发明实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括接收单元、业务对象变更单元和联动单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,接收单元还可以被描述为“向业务对象变更单元提供状态转移消息的单元”。
[0099]
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中的。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该设备执行时,使得该设备执行的步骤包括:接收指向第一状态机实例的第一状态转移消息;其中,第一状态转移消息中携带有第一状态机实例对应的业务对象的标识、以及用于指示第一状态机实例进行状态转移的第一事件;依据第一事件对第一状态机实例进行状态转移,执行对应于该状态转移的预设动作,基于所述动作和第一状态转移消息中携带的业务对象标识对业务对象的状态进行变更;基于所述动作使第一状态机实例向与第一状态机实例关联的第二状态机实例发送第二状态转移消息,以使第二状态机实例进行状态转移;其中,第二状态转移消息中携带有第二状态机实例对应的业务对象的标识、以及用于指示第二状态机实例进行状态转移的第二事件。
[0100]
在本发明实施例的技术方案中,预先在状态机实例中设置消息封装及发送功能,当某状态机实例接收到状态转移消息进而进行状态转移时,在执行对应于该状态转移的预设动作对相应的业务对象状态进行变更之余,执行该预设动作使该状态机实例向与该状态机实例关联的状态机实例发送另一状态转移消息,从而使关联的状态机实例也执行状态转移,由此实现任意多个状态机实例的状态转移联动,满足了业务对象之间状态转移联动的业务场景。另外,在获取状态机实例时,本发明实施例除直接创建的方式之外,还可以使用在持久化存储单元预存的、与业务对象一一对应的状态机数据,将该状态机数据反序列化即可形成状态机实例,或者,调用内存对象池中预存的状态机实例,将该状态机实例的当前状态与业务对象当前状态调整为一致,以此形成需要的状态机实例,使用这两种方式能够减少对状态机实例的频繁创建,消除创建、回收对象产生的内存、cpu以及网络开销。
[0101]
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献