我注意到发送到 gen_fsm 进程的 pid 的消息在状态回调中作为事件匹配。这只是偶然还是我可以依赖此功能?
通常我希望发送到 gen_fsm 的一般消息会显示在 handle_info/3 回调中,并认为我必须使用 gen_fsm:send_event 重新发送它。
gen_fsm 是否尝试首先将消息与状态回调匹配,然后始终与 handle_info/3 回调匹配?还是仅当它与状态回调子句不匹配时?
但是,当我尝试它时,我的消息似乎根据调试输出被处理了两次。
所以基本上这个问题也可以这样表述:如何正确处理接收到的消息作为 gen_fsm 状态函数中的事件?
澄清:对于这个问题,应该考虑通过传递消息而发生的一些事件。
我知道,在许多情况下,仅通过对 fsm 使用函数调用来使协议可见是更干净的。
我不太确定这是否会改进提到的 gen_fsm 必须适合的当前框架:不同的协议栈,其中每一层调用一个 connect() 函数来附加(有时启动)较低层。数据包通过调用函数(发送)被发送到较低层,并通过receive
消息接收。很像 gen_tcp。
通过查看 gen_fsm 的代码,我已经发现一般消息仅传递给 handle_info,因此问题仍然存在,是直接从 handle_info/3 回调调用状态函数还是使用 gen_fsm:send_event 重新发送。