Erlang 从XMPP注销客户端

Erlang 从XMPP注销客户端,erlang,xmpp,ejabberd,Erlang,Xmpp,Ejabberd,我有一个xmpp/ejabberdb应用程序,它使用一个外部服务来提供事件功能,但是当这个服务不可用时,我想断开/注销我的所有客户端。这可能吗?如何做?我不知道ejabberd的具体细节,但是您可以编写一个自定义的XMPP组件来轮询外部服务(或者侦听状态事件,如果它是另一个XMPP组件),然后在服务不可用时注销用户。我已经按照我需要的方式运行了。事实上,在某种情况下,我没有找到任何简单的方法让我自己的服务器注销所有连接的用户,所以我深入研究了ejabberd的代码,并找到了自己的方法 在ejab

我有一个xmpp/ejabberdb应用程序,它使用一个外部服务来提供事件功能,但是当这个服务不可用时,我想断开/注销我的所有客户端。这可能吗?如何做?

我不知道ejabberd的具体细节,但是您可以编写一个自定义的XMPP组件来轮询外部服务(或者侦听状态事件,如果它是另一个XMPP组件),然后在服务不可用时注销用户。

我已经按照我需要的方式运行了。事实上,在某种情况下,我没有找到任何简单的方法让我自己的服务器注销所有连接的用户,所以我深入研究了ejabberd的代码,并找到了自己的方法

在ejabberd_c2s.erl模块中,当客户端注销或其套接字因某种原因被丢弃时,FSM将终止,执行所有必要的清理以保持ejabberd的一致性

我要做的就是在这个模块中创建一个导出函数shutdown/1,调用gen_fsm:send_all_state_event/2发送终止信号。 对于每个连接都有一个c2s进程,我需要为每个用户调用这个函数

---更新--- 实际上,没有必要创建这个关闭功能,因为ejabber_c2s已经能够处理“关闭”信号,这也可以实现同样的功能。因此,与其创建shutdown函数,只需执行ge_fsm:send_事件(C2SPid,closed)就足够了。 ---更新---

要发现用户的c2s进程PID,我只需使用ejabberd_sm:get_session_PID/1或ejabberd_sm:dirty_get_sessions_list/0(用于所有会话)

这对我来说很好,但如果有人有更好的想法,请在这里添加


谢谢

定制的XMPP组件正是我所拥有的,关键是,我如何注销客户端?我不是XMPP/Ejabberd方面的专家,所以我想了解一下如何通过编程方式注销客户机。