Я работал так, как мне было нужно.На самом деле, я не нашел простого способа заставить свой сервер выйти из системы всех подключенных пользователей в какой-то ситуации, поэтому я покопался в коде ejabberd и нашел способ сделать это сам.
В ejabberd_c2sМодуль .erl, когда клиент выходит из системы или его сокет по какой-либо причине сбрасывается, FSM завершается, выполняя всю необходимую очистку для поддержания согласованности ejabberd.
Мне нужно было просто создать экспортированную функциюshutdown / 1 в этом модуле, который вызывает gen_fsm: send_all_state_event / 2, посылая сигнал для его завершения.Поскольку для каждого соединения есть один процесс c2s, мне нужно вызывать эту функцию для каждого пользователя.
--- ОБНОВЛЕНИЕ --- На самом деле нет необходимости создавать эту функцию выключения, как ejabber_c2sуже имеет возможность обрабатывать «закрытый» сигнал, который делает то же самое.Таким образом, вместо создания функции завершения работы достаточно просто выполнить ge_fsm: send_event (C2SPid, closed). --- ОБНОВЛЕНИЕ ---
Чтобы обнаружить PID процесса c2s пользователя, я просто использую ejabberd_sm: get_session_pid / 1 или ejabberd_sm: dirty_get_sessions_list / 0 (для всех сессий).
Для меня это работало нормально, но если у кого-то есть идея получше, добавьте сюда.
Спасибо