这里的请求是需要部署的应用程序名称,以及它所依赖的应用程序。
Request for application A -> A is in a QUEUED state
Discover A's dependency B -> B is in a QUEUED state
B is being processed -> B is in a PROCESSING STATE
A is being processed -> A is in a PROCESSING STATE
B is processed -> B is in a DONE state
A is processed -> A is in a DONE state
为此,在发现时我正在初始化有限状态机。因此,当请求到达时,创建A
的FSM;当从其中一个actor中发现B
时,初始化B
的FSM。
我是否需要初始化并将FSM实例传递给所有演员,并同时告知FSM正在执行的操作,以便状态机进入正确的状态?
这是状态机的相关部分:
when(QUEUED, matchEvent(requestAccepted.class, MyApp.class,
(requestAccepted, service) ->
goTo(PROCESSING).replying(PROCESSING)));
when(PROCESSING, matchEvent(completed.class, MyApp.class,
(completed, service) -> goTo(DONE).replying(DONE)));
// During transitions, save states in the database.
onTransition(matchState(PROCESSING, DONE, () -> {
nextStateData().setServiceStatus(DONE);
databaseWriter.tell(nextStateData(), getSelf());
以下是一个演员处理请求的示例:
ProcessingActor extends AbstractActor {
@Override
public void onReceive(Object message) throws Throwable {
if (message instanceof processApplication) {
// process the app
// Initialize FSM for the Application
FSM myFSM = Props.create(MYFSM.class);
myFSM.tell( new completed(processApplication.app)
}
这样初始化状态机并使用它是正确的方法吗?还是应该在ProcessingActor
的构造函数中进行初始化?但是在那种情况下,每个应用程序(数据)将不会有一个状态机。
AbstractFSMWithStash
,你可以使用它们来代替通用的AbstractActor
。 - rvazquezglez