【发布时间】:2018-11-13 20:16:30
【问题描述】:
我正在尝试将 Akka 的有限状态机框架用于我的用例。我正在开发一个系统来处理经过各种状态的请求。
这里的请求是需要连同它所依赖的应用一起部署的应用名称:
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是在请求进来时创建的,B的FSM是在B被其中一个actor发现时初始化的。
我是否初始化并将 FSM 实例传递给所有参与者,同时tell 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 的构造函数中进行初始化?但在这种情况下,每个应用程序(数据)不会有一个状态机。
【问题讨论】:
-
我认为这个问题缺少答案,因为它非常不清楚。我重读了 3 次,但仍然不确定您要达到什么目标以及如何实现。我认为由于您似乎以至少两种不同的含义使用术语“应用程序”,否则我完全不明白您的句子“我正在处理 应用程序 处理应用程序 ...”的意思。请尝试在问题中添加更多详细信息,然后有人可能会帮助您。
-
我认为这个问题在当前状态下无法回答。它过于基于意见和模糊。如果您的解决方案有效,那么它就有效。谁来说什么是“正确的方式”。
-
它现在可以工作了,但我想知道这种设计是否会持续下去。
-
一般而言,AKKA 解决方案不会编写一次。 API 往往会随着时间而改变,预计需要为新的 akka 版本重写它。如果你使用 akka 2.5.x,你应该使用 receivebuilders。而不是 onReceive。
-
FSM 中还有一些更专业的类,比如
AbstractFSMWithStash,你可以使用它们来代替一般的AbstractActor
标签: java scala akka state-machine