我可以在gen_fsm状态回调中处理任何收到的消息吗?

时间:2010-10-18 19:05:48

标签: erlang otp gen-fsm

我注意到发送到gen_fsm进程的pid的消息在状态回调中匹配为事件。这只是偶然的还是我可以依赖这个功能?

通常情况下,我希望发送到gen_fsm的常规消息显示在handle_info / 3回调中,并且我认为我必须使用gen_fsm重新发送它:send_event。

gen_fsm是否尝试首先将消息与状态回调匹配,然后依次使用handle_info / 3回调?或者只有它与状态回调子句不匹配?

然而,当我尝试它时,根据调试输出,我的消息似乎被处理了两次。

所以基本上问题也可以这样说:如何正确处理收到的消息作为gen_fsm状态函数中的事件?


澄清:对于此问题,应考虑通过传递消息而发生的某些事件。

我知道在很多情况下,通过仅使用函数调用来使协议可见,它更清晰。

我不确定这是否会改进当前提到的gen_fsm必须适应的框架:不同的协议栈,其中每个层调用connect()函数来附加(有时开始)下层。数据包被发送到较低层ba调用函数(发送)并通过receive消息接收。很像gen_tcp。

通过查看gen_fsm的代码,我已经发现一般消息只传递给handle_info,所以只有问题仍然是直接从handle_info / 3回调调用状态函数或使用gen_fsm重新发送:send_event。

1 个答案:

答案 0 :(得分:1)

一般消息由handle_info回调处理,除非你的代码中有这样的东西:

handle_info(Info,StateName,StateData) - >   ?MODULE:StateName(Info,StateData)。

这样可以避免重新发送,但我不建议再发送,也不重发。

通过封装send_event / sync_send_event / send_all_state_event / sync_send_all_state_event的API调用专门发送事件使协议显式化。这是正确的事情,因为它更容易理解,维护和记录edoc。