有限状态机和FSM间信令

14 erlang scala state-machine fsm

具有本机(因此没有FSM生成工具)的语言的建议支持状态机开发和执行以及消息/信号的传递.这适用于电信,例如实现这种复杂程度的FSM.

我考虑过Erlang,但是会喜欢一些反馈,建议,教程指针,替代方案,尤其是基于Java的框架.也许斯卡拉?

仅限开源.我不是在寻找UML或正则表达式相关的解决方案.

由于这是用于实现电信协议,因此FSM可能是非平凡的.许多状态,许多转换,基于信号,输入约束/保护.动态实例化将是一个加号.切换语句是不可能的,它很快就会无法使用.如果/其他几乎没有好处.

我宁愿依赖于图形设计; 格式FSM描述应该是人类可读/可编辑/可管理的.

-

我决定专注于基于Actor的C++解决方案

例如,Theron框架提供了一个起点http://theron.ashtonmason.net/,并且为了避免基于FSM的事件处理程序中的switch语句,这个C++ FSM模板框架看起来很有用http://satsky.spb.ru/articles/ FSM/fsmEng.php

arc*_*lus 10

这个特殊的应用程序,telco协议实现,是Erlang的构建.Erlang在爱立信的最初应用是电话交换机,最早的商业产品是支持各种电信协议的ATM交换机.

OTP具有实现FSM的标准行为gen_fsm.在一些OTP文档中有一个在非平凡FSM中使用的例子.

OSERL是Erlang中的开源SMPP实现,演示了如何使用gen_fsms 实现telco协议.一个很好的例子就是gen_esme_session.

虽然我不能指向你的代码,我知道有不少的Erlang公司出售电信公司主导产品:Corelatus,突触,原动力等等.


Fla*_*gan 8

我同意转换声明应该是不可能的......它们最终导致维护噩梦.你不能使用状态模式来实现你的FSM吗?根据您的实际实现,您可以使用actor(如果您有多个FSM协作 - 嗯......可能吗?).关于actor的好处是传递消息的框架已经存在.

使用State的一个例子是:

trait State {
  def changeState(message: Any): State
}

trait FSM extends Actor {
  var state: State

  def processMessage(message: Any) {
    state = state.changeState(message)
  }

  override def act() {
    loop {
      react {
        case m: Any => processMessage(m)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是非常基本的代码,但由于我不知道更多的要求,这是我能想到的最多.国家的优势在于每个州在一个阶级中都是独立的.

  • 为了记录,Akka FSM是一个很好的解决方案. (2认同)