我在erlang方面经验不足,但需要解决一些任务。
我们正在使用Ejabberd进行消息传递,我们希望在用户离线时向用户移动设备发送推送通知。对于DB,我们使用的是MySQL。 因为用户可以拥有更多设备,并且通常情况下用户在一台设备上联机但在第二台设备上脱机。我们希望在第二台设备上收到推送通知。我们有自己的推送服务器并从Ejabberd调用他的推送API
我创建了一个新模块,它处理类型为urn的IQ:xmpp:gcm:0,其中应用程序正在发送他的推送令牌。我写入DB表用户,资源,令牌和用户状态(在线/离线)
当用户会话关闭时,我将该资源状态更新为离线。
我在事件" user_send_packet"上添加了钩子我从DB加载目标用户的所有离线资源,并向他们发送推送通知。
我创建模块mod_notification.erl - 用于消息解析和处理 和模块mod_notification_sql.erl - 用于SQL查询和更新处理
这是模块
中实现的钩子 gen_iq_handler:add_iq_handler(ejabberd_sm, Host, <<?NS_GCM>>, ?MODULE, iq, no_queue),
ejabberd_hooks:add(user_send_packet, Host, ?MODULE, user_send_packet, 500),
ejabberd_hooks:add(sm_register_connection_hook, Host, ?MODULE, user_online, 100),
ejabberd_hooks:add(sm_remove_connection_hook, Host, ?MODULE, user_offline, 100),
此模块导致内存泄漏但我无法解决问题。
与数据库的通信非常类似于&#34; mod_mam_sql&#34;基本上只是不同的查询和变量。
我可以发布完整的代码但是要开始如果有人可以告诉我可能是内存泄漏的原因。因为我没有使用某些缓存或直接内存分配。
更新:当我评论iq处理程序初始化泄漏消失时,IQ处理正在泄漏。在iq处理程序中有什么规则应该做什么?
先谢谢, Laslo