多个gen_esme会话

时间:2015-12-04 11:22:14

标签: erlang smpp

相信你们都做得很好。

我正在尝试使用OSERL应用程序为SMSC创建多个会话。 由于要创建SMPP客户端,您需要继承gen_esme行为。

我想知道是否可以在不编写多个gen_esme模块的情况下与SMSC建立多个连接?

1 个答案:

答案 0 :(得分:1)

使用相同的基于gen_esme的模块启动多个进程有两种主要策略:

  1. gen_esme:start_link/4 - 基于命名或参考的服务器
  2. gen_esme:start_link/3 - 基于pid的服务器
  3. 我将引用sample_esme下的examples for oserl文件。

    命名服务器

    oserl中的大多数示例都显示gen_esme:start_link/4的使用情况,后者又调用gen_server:start_link/4ServerName的{​​{1}}变量的typepec为gen_server:start_link/4

    这意味着如果我们将{local, Name::atom()} | {global, GlobalName::term()} | {via, Module::atom(), ViaName::term()}函数更改为如下所示:

    sample_esme:start_link/0,1,2

    我们可以使用以下方式启动多台服务器:

    start_link() ->
        start_link(?MODULE).
    
    start_link(SrvName) ->
        start_link(SrvName, true).
    
    start_link(SrvName, Silent) ->
        Opts = [{rps, 1}, {queue_file, "./sample_esme.dqueue"}],
        gen_esme:start_link({local, SrvName}, ?MODULE, [Silent], Opts).
    

    要使我们的sample_esme:start_link(). %% SrvName = 'sample_esme' sample_esme:start_link(my_client1). %% SrvName = 'my_client1' sample_esme:start_link(my_client2). %% SrvName = 'my_client2' 模块正常使用此命名服务器策略,需要修改其大多数调用函数。我们以sample_esme为例:

    sample_esme:rps/0,1

    现在我们可以在任何正在运行的服务器上调用rps() -> rps(?MODULE). rps(SrvName) -> gen_esme:rps(SrvName). 函数:

    gen_esme:rps/1

    这类似于pooler之类的项目如何引用它创建的池成员。

    pid服务器

    这与命名服务器策略基本相同,但我们只是传递服务器的pid而不是注册的原子。

    这意味着如果我们将sample_esme:rps(). %% calls 'sample_esme' sample_esme:rps(my_client1). %% 'my_client1' sample_esme:rps(my_client2). %% 'my_client2' 函数更改为如下所示:

    sample_esme:start_link/0,1

    请注意,我们所做的只是删除start_link() -> start_link(true). start_link(Silent) -> Opts = [{rps, 1}, {queue_file, "./sample_esme.dqueue"}], gen_esme:start_link(?MODULE, [Silent], Opts). 参数,因此它不会在服务器的pid中注册{local, SrvName}原子。

    这意味着我们需要捕获每个创建的服务器的pid:

    SrvName

    使用命名服务器中的相同{ok, Pid0} = sample_esme:start_link(). {ok, Pid1} = sample_esme:start_link(). {ok, Pid2} = sample_esme:start_link(). 示例,我们需要删除sample_esme:rps/0,1并添加一个带有pid的sample_esme:rps/0函数:

    sample_esme:rps/1

    现在我们可以在任何正在运行的服务器上调用rps(SrvPid) -> gen_esme:rps(SrvPid). 函数:

    gen_esme:rps/1

    这类似于poolboy之类的项目如何引用它创建的池成员。

    推荐

    如果您只是想集中连接,我建议您使用poolerpoolboy这样的库。

    如果您想要通过名称引用有限数量的特定命名连接,我建议只为每个连接提供一个具有以下子规范的主管:

    sample_esme:rps(Pid0).
    sample_esme:rps(Pid1).
    sample_esme:rps(Pid2).