相信你们都做得很好。
我正在尝试使用OSERL应用程序为SMSC创建多个会话。 由于要创建SMPP客户端,您需要继承gen_esme行为。
我想知道是否可以在不编写多个gen_esme模块的情况下与SMSC建立多个连接?
答案 0 :(得分:1)
使用相同的基于gen_esme
的模块启动多个进程有两种主要策略:
gen_esme:start_link/4
- 基于命名或参考的服务器gen_esme:start_link/3
- 基于pid的服务器我将引用sample_esme
下的examples for oserl文件。
oserl中的大多数示例都显示gen_esme:start_link/4
的使用情况,后者又调用gen_server:start_link/4
。 ServerName
的{{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而不是注册的原子。
这意味着如果我们将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之类的项目如何引用它创建的池成员。
如果您只是想集中连接,我建议您使用pooler或poolboy这样的库。
如果您想要通过名称引用有限数量的特定命名连接,我建议只为每个连接提供一个具有以下子规范的主管:
sample_esme:rps(Pid0).
sample_esme:rps(Pid1).
sample_esme:rps(Pid2).