Я заметил, что сообщения, отправленные на pid процесса gen_fsm, сопоставляются в обратных вызовах состояния как события. Это просто случайно или я могу положиться на эту функцию?
Обычно я ожидал бы, что общие сообщения, отправленные gen_fsm, будут отображаться в обратном вызове handle_info / 3, и подумал, что мне придется повторно отправить его, используя gen_fsm: send_event.
Пытается ли gen_fsm сопоставить сообщение сначала с обратным вызовом состояния, а затем всегда с обратным вызовом handle_info / 3? Или только если он не соответствует предложению обратного вызова состояния?
Однако, когда я пытаюсь это сделать, моё сообщение кажется обработанным дважды согласно выводу отладки.
Таким образом, в основном вопрос также может быть сформулирован так: как правильно обрабатывать полученные сообщения как события в функциях состояния gen_fsm?
Разъяснение: что некоторые события происходят при получении передаваемых сообщений, должны рассматриваться как заданные для этого вопроса.
Мне известно, что во многих случаях проще сделать протокол видимым, используя вызовы функций только в fsm.
Я не уверен, улучшит ли это текущую среду, в которую должен вписываться упомянутый gen_fsm: стеки различных протоколов, где каждый уровень вызывает функцию connect () для присоединения (а иногда и запуска) нижнего уровня. Пакеты отправляются на нижние уровни при вызове функции (send) и принимаются с помощью receive
сообщения. Очень похоже на gen_tcp.
Глядя на код для gen_fsm, я уже выяснил, что общие сообщения передаются только в handle_info, поэтому остается только вопрос вызова функции состояния напрямую из обратного вызова handle_info / 3 или повторной отправки с использованием gen_fsm: send_event.