2016-05-09 4 views
0

私は自分のチャンネルクラスでGenServerを呼び出しています。 GenServerにはpidが必要です。そのpidを永続化することで、GenServer内のjoinメソッドが呼び出されるたびに、同じpidでGenServerを呼び出すことができます。私はソケットのパラメータでそれを保存する必要がありますか、私はチャネルとフロントエンドのjavascriptの間で前後に渡す必要がありますか?チャネルでGenServerを使用しています。どのようにpidを維持するには?

答えて

1

私は最近、GenServersを扱うときにpidの代わりに名前を使用することを選択しました。あなたはGenServer.start_link/3nameパラメータを渡し、その後、例えばGenServer.cast/2私の場合は、例えば、サーバの名前(生成するチャンネルに送られた固有のIDを使用しています(他の呼び出しでそれを使用することができます。。:"document-1")を

最大の欠点をBEAMには原子数に制限があるため、生成される名前の数が大きすぎるとクラッシュする可能性があるので、このソリューションを実装するときに考える必要があります。

0

私が得た方法クライアントがブラウザをリフレッシュすると、ソケットのpidが変更される可能性があるため、これを回避するにはsocket.topicをGenServerプロセスに渡します。

GenServerから、MyApp.Endpoint.broadcast! socket_topic, "some_notification", messageでトピックにブロードキャストできます。 チャネル内のメッセージを傍受して、クライアントに直接送信するか、クライアントに直接送信することができます。

0

私が正しく覚えていれば、フェニックスチャンネル内で作成されたgenserverプロセスはチャンネルプロセスにリンクされています。したがって、genserverプロセスとチャネルとのリンクを解除することができます。そして同じpidが残るようにプロセスの名前を登録します。

関連する問題