ejabberd:生成自己的进程并将结果路由回客户端

Posted

技术标签:

【中文标题】ejabberd:生成自己的进程并将结果路由回客户端【英文标题】:ejabberd: spawn own process and route the result back to client 【发布时间】:2020-04-24 18:37:13 【问题描述】:

此后,ejabberd 不再支持 iqdisc 选项。我正在尝试创建自己的自定义队列来处理具有自定义命名空间的所有 iq 数据包并将结果返回给客户端。 我能够生成自己的进程并运行函数并获得结果。但该过程最终失败并出现以下错误:

09:07:42.850 [error] Failed to route packet:
#iqid = <<"5b660017-c52c-4fe8-8a56-213c1a86bc12-3">>,type = get,
    lang = <<"en">>,
    from =
        #jid
            user = <<"check">>,server = <<"localhost">>,
            resource = <<"64195176449188261912514">>,luser = <<"check">>,
            lserver = <<"localhost">>,
            lresource = <<"64195176449188261912514">>,
    to =
        #jid
            user = <<>>,server = <<"localhost">>,resource = <<>>,luser = <<>>,
            lserver = <<"localhost">>,lresource = <<>>,
    sub_els =
        [#xmlel
             name = <<"....
......
.......
exception error: no try clause matching ok
   in function  gen_iq_handler:process_iq/4 (src/gen_iq_handler.erl, line 110)
   in call from ejabberd_router:do_route/1 (src/ejabberd_router.erl, line 399)
   in call from ejabberd_router:route/1 (src/ejabberd_router.erl, line 92)
   in call from ejabberd_c2s:check_privacy_then_route/2 (src/ejabberd_c2s.erl, line 842)
   in call from xmpp_stream_in:process_authenticated_packet/2 (src/xmpp_stream_in.erl, line 697)
   in call from xmpp_stream_in:handle_info/2 (src/xmpp_stream_in.erl, line 392)
   in call from p1_server:handle_msg/8 (src/p1_server.erl, line 696)
   in call from proc_lib:init_p_do_apply/3 (proc_lib.erl, line 249)

上面显示的数据包是从客户端到服务器的:这对我来说看起来不错。 我正在使用最新的 ejabberd 版本:19.09.1 我想,我无法将 iq-packet 响应路由回客户端?我在这里错过了其他东西吗?这个包对我来说似乎很好。将队列专用于处理所有 iq 数据包到自定义命名空间,然后将响应返回给客户端,同时不阻塞主队列的理想方法是什么,这样 ejabberd 仍然可以处理其他传入的数据包。

任何想法/指针将不胜感激。谢谢!

【问题讨论】:

您的目的地是;我希望ejabberd 无法理解将消息路由到哪里。确保iqto 键下的值至少包含已填充的user 字段。 上面显示的数据包是从客户端到服务器的:这对我来说看起来不错。 ejabberd 模块抱怨它由于某种原因无法处理此数据包。有没有更好的方法来生成一个进程并让它返回一个数据包给客户端? 【参考方案1】:

我想通了。 生成的进程没有返回所需的结果,因此请求失败。 我仍在尝试弄清楚如何在 ejabberd 上一次处理多个数据包(目标到不同的命名空间),以便我可以将所有数据包运行到我的自定义命名空间以在单个队列上运行。

【讨论】:

以上是关于ejabberd:生成自己的进程并将结果路由回客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从客户端(android-java 应用程序)发送到解析服务器,对其进行处理,将其保存在 parse-dashboard 中并将结果发送回客户端?

具有流管理 (XEP-198) 的 Ejabberd 不使用离线消息挂钩

DateTime.ToString 格式化并将结果字符串反转回日期时间

使用 ejabberd 将 nick 字段添加到注册新的 xmpp 用户名

如何将 URL 反射回查询生成器

ejabberd:并行处理具有不同命名空间的多个数据包