我注意到发送到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。
答案 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。