4

いくつかの追加機能で拡張gen_server(作成)したい。gen_server_extra要件は次のとおりです。

  1. プロセスは通常のgen_server_extraように動作する必要がありますgen_server。たとえば、経由での通話の受け入れgen_server:call、SASLとの統合、OTC監視ツリーの適合などが必要です。
  2. gen_server_extraプロセスには、によって提供される追加機能が必要gen_server_extraです。これは基本的に、一部のメッセージがgen_server_extraコールバックモジュールに渡されることなく、コードによって処理されることを意味します。残りのメッセージはそのままコールバックモジュールに渡されます。
  3. gen_server_extra機能には、コールバックモジュールから非表示にする必要がある独自の状態が必要です。

それを行うための最も簡単なアプローチは何ですか?

4

2 に答える 2

7

最良の、最もモジュール化されたアプローチは、モジュール(たとえばgen_ext_server)に新しい動作を実装し、そこから動作をラップするgen_serverことです。

まず、あなたの行動が以下と同じであることを確認してくださいgen_server

-module(gen_ext_server).
-behavior(gen_server).

% Exports...

behaviour_info(Type) -> gen_server:behaviour_info(Type).

に必要なすべてのコールバックgen_serverを実装し、動作を実装するコールバックモジュールの名前を自分の状態に保ちます。

init([Mod|ExtraArgs]) ->
    % ...
    ModState = Mod:init(ExtraArgs),
    #state{mod = Mod, mod_state = ModState, internal = [...]}

次に、各gen_serverコールバックで動作を実装し、必要に応じてコールバックモジュールを呼び出します。

handle_call(internal, _From, State) ->
    % Do internal stuff...
    {reply, ok, State};
handle_call(Normal, From, State = #state{mod = Mod, mod_state = ModState}) ->
    case Mod:handle_call(Normal, From, ModState) of
        {reply, Reply, NewState} ->
            {reply, Reply, #state{mod_state = NewState};
        ... ->
            ...
    end.

handle_cast/2、などhandle_info/2に同様の機能を実装します。terminate/1

于 2011-07-19T10:52:41.917 に答える
-1

まあ、私はそれをカスタマイズとは呼びませんが、むしろ新しい振る舞いと呼びます。独自の動作を定義する必要があります。これを説明するチュートリアルは、trapexit.orgにあります。
ただし、要件はあまり適切ではありません。

コールバック関数にサーバー状態へのアクセスを許可する主な本質は、同時実行の詳細を中断することなく、必要なときに必要な場所でアプリケーションの状態を操作する通常のシーケンシャルコードを作成することです。それ以外の場合は、それが進むべき道である場合は、独自の動作を実装してください。

于 2011-07-19T11:32:43.290 に答える