首页 > 解决方案 > 如何接收发送到在 gen_server 内运行的 PID 的消息

问题描述

如果网络出现故障或发生意外情况,与 APN 的枪支连接将断开。在这种情况下,apns4erl 将向客户端进程发送一条消息{reconnecting, ServerPid},这意味着 apns4erl 失去了连接,它正在尝试重新连接。连接恢复后,{connection_up, ServerPid}将发送一条消息。

我的问题是:

标签: erlangejabberderlang-supervisorejabberd-module

解决方案


发送到 gen_server 进程的消息,例如GenServerPid ! {ok, 10}},由以下人员处理:

handle_info(Msg, State)

所以,你可以这样做:

handle_info({reconnecting, ServerPid}=Msg, State) ->
     %%do something here, like log Msg or change State;
handl_info({connection_up, ServerPid}=Msg, State) ->
     %%do something here, like log Msg or change State;   
handle_info(#offline_msg{us = _UserServer,
          from = From, to = To, packet = Packet} = _Msg, State) ->
     %%do something.

回复评论:

这是您当前的代码:

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}}.

你可以把它改成这样:

init([Host, _Opts]) ->
    spawn(?MODULE, start_apns, []),
    ...


start_apns() ->

          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,
          apns_loop().

apns_loop() ->
    receive
        {reconnecting, ServerPid} -> %%do something;
        {connection_up, ServerPid} -> %% do something;
        Other -> %% do something
    end,
    apns_loop().
  

启动apns进程后,apns进程会进入一个循环等待消息。


推荐阅读