作为新手,使用gen_server编写玩具匹配(交易)引擎。
一旦发生交易/匹配,就需要通知两个客户。
文档说:
reply(Client, Reply) -> Result
类型:
Client - see below Reply = term() Result = term()
gen_server可以使用此功能明确发送答复 当回复时,给称为
call/2,3
或multi_call/2,3,4
的客户端 无法在Module:handle_call/3
的返回值中定义。客户端必须是提供给回调函数的参数。回复是一个任意术语,它将回到 客户端作为
call/2,3
或multi_call/2,3,4
的返回值。返回值结果没有进一步定义,应始终是 被忽略。
给定上述方式如何将通知发送给其他客户。
动作的样本序列
C1 -> Place order IBM,BUY,100,10.55
Server -> Ack C1 for order
C2 -> Place order IBM,SELL,100,10.55
Server -> Ack C2 for order
-> Trade notification to C2
-> Trade notification to C1 %% Can I use gen_server:reply()
%% If yes - How ?
好吧,你不能。您的ACK
是已经答复。gen_server:call
合同只能接受单个答复。我的意思是,gen_server:call
只会等待一个答复。
通常可以像
一样实现gen_server:reply
reply({Pid, Ref}, Result) ->
Pid ! {Ref, Result}.
这意味着,如果您尝试发送多个答复,则只需在呼叫者过程的消息框中获取一些Weired消息。
建议
我相信,您应该在ACK过程中以该参考CX_Ref
发送给呼叫者,并将消息发送给呼叫者。然后,当您必须发送通知时,您只需向C1
和{C2_Ref, Payload}
发出消息{C1_Ref, Payload}
。
您也可能想引入一些监视以处理经纪人崩溃。