【发布时间】:2021-06-02 11:39:09
【问题描述】:
-
我有一个 ejabberd 服务器
-
我有一个自定义模块,
my_apns_module.erl,它由 ejabberd 服务器运行,如下所示:start_link(Host, Opts) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), ?GEN_SERVER:start_link({local, Proc}, ?MODULE, [Host, Opts], []). start(Host, Opts) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), ChildSpec = {Proc, {?MODULE, start_link, [Host, Opts]}, temporary, 1000, worker, [?MODULE]}, supervisor:start_child(ejabberd_sup, ChildSpec). stop(Host) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), ?GEN_SERVER:call(Proc, stop), supervisor:delete_child(ejabberd_sup, Proc), ok. init([Host, _Opts]) -> ... handle_call(stop, _From, State) -> {stop, normal, ok, State}. handle_cast(_Msg, State) -> {noreply, State}. handle_info(#offline_msg{us = _UserServer, from = From, to = To, packet = Packet} = _Msg, State) -> ... handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, State) -> Host = State#state.host, ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. -
在 init 中,我运行另一个 APNs 应用程序来发送推送通知。 https://github.com/inaka/apns4erl
init([Host, _Opts]) -> apns:start(), case apns:connect(cert, ?APNS_CONNECTION) of {ok, PID} -> ?INFO_MSG("apns connection successful with PID ~p~n", [PID]); {error, timeout} -> ?ERROR_MSG("apns connection unsuccessful reason timed out", []) end, {ok, #state{host = Host}}. -
这是有效的,因为我可以发送通知。
-
现在文档 (https://github.com/inaka/apns4erl) 说:
如果网络出现故障或发生意外情况,枪 与 APN 的连接将断开。在这种情况下,apns4erl 将发送一个 向客户端进程发送消息
{reconnecting, ServerPid},这意味着 apns4erl 失去了连接,它正在尝试重新连接。一旦 连接已恢复{connection_up, ServerPid}消息将 发送。
我的问题是:
- 我应该在
my_apns_module.erl中写什么代码来接收{reconnecting, ServerPid}或{connection_up, ServerPid}?
【问题讨论】:
标签: erlang ejabberd erlang-supervisor ejabberd-module