2016-06-17 3 views
2

初心者の方は、gen_serverを使っておもちゃのマッチング(取引)エンジンを作成してください。Erlang:gen_server - 2つのクライアントに返信

取引が行われると、両方のクライアントに通知する必要があります。

reply(Client, Reply) -> Result 

タイプ:

Client - see below 
Reply = term() 
Result = term() 

この機能を明示的にするとき、call/2,3またはmulti_call/2,3,4と呼ばれるクライアントに返信 を送信するためにgen_serverで使用することができます

ドキュメントと言います応答 は、戻り値Module:handle_call/3で定義できません。

クライアントは、コールバック関数に指定されたFrom引数でなければなりません。返信は に戻り値call/2,3またはmulti_call/2,3,4として返される任意の用語です。

戻り値resultはそれ以上定義されておらず、常に を無視する必要があります。

上記を前提として、他のクライアントに通知を送信することができます。行動

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 ? 

答えて

1

ウェルの

サンプルシーケンス、あなたがすることはできません。あなたのACKです。すでにです。 gen_server:call契約で返信できるのは1回だけです。つまり、gen_server:callは1つの返信を待つだけです。一般

gen_server:replyは、あなたが複数の応答を送信しようとした場合、あなただけの呼び出し元プロセスのメッセージボックスにいくつかのweiredメッセージを取得することを意味することに

reply({Pid, Ref}, Result) -> 
    Pid ! {Ref, Result}. 

のように実装することができます。

提案

は代わりに、私はあなたには、いくつかの参照に関連付けるすべての貿易を送信し、ACK手順の間に、その参照CX_Refして、発信者にメッセージを送信する必要があり、信じています。通知を送信する必要がある場合は、メッセージ{C1_Ref, Payload}C1{C2_Ref, Payload}をC2に送信するだけです。

また、ブローカのクラッシュを処理するための監視機能を導入することもできます。

+0

説明を明確にするために、これはgen_serverが取引エンジンには適切でないことを意味します。これは、推奨されるgen_ *を使用することに意味があります。 – CSP

+1

@CSP、私はgen_serverが不適切だと言っているわけではない、私はそれが最良の解決策ではないと言っている。私はあなたがそれから始めることができると信じていますが、後でこの決定を変更したいかもしれません。 – Lol4t0

関連する問題