1)これは、いくつかのクライアント
で動作しますはい、それはありません。クライアントごとに1つのメッセージキューが割り当てられます(AcknowledgedMessagesClientExtensionを参照)。
2)これは、クライアントがmaxInterval内で復元しない場合でも、メッセージが失われることを意味しますか?
はい、あります。クライアントがmaxIntervalミリ秒間サーバーに到達できない場合、サーバーはそのクライアントに関連付けられているすべての状態を破棄します。
2.1)maxIntervalはどれくらいですか?どのような結果をそれを高い価値に設定する必要がありますか?
maxIntervalは、Cometd servletのサーブレットパラメータです。これは内部的に長い値として扱われるため、その最大値はLong.MAX_VALUEです。
設定例:
<init-param>
<!-- The max period of time, in milliseconds, that the server will wait for
a new long poll from a client before that client is considered invalid
and is removed -->
<param-name>maxInterval</param-name>
<param-value>10000</param-value>
</init-param>
高い値に設定するには、サーバーが(クライアントがサーバとの接触を停止した時点から)クライアントに関連付けられている状態を捨てる前に長く待つことを意味します。
これには2つの問題があります。第1に、サーバのメモリ要件が潜在的に高くなります(サービスの拒否も簡単になる可能性があります)。次に、maxIntervalが期限切れになる前にRemoveListenerがサーバー上で呼び出されないため、「一時的に到達できない」と「切断された」とを区別する追加のロジックを実装する必要が生じる場合があります。
2.2)少なくとも数分のフェイル・アウトに対して安全なメカニズムが必要です。これは可能ですか?選択肢はありますか?
はい、maxIntervalを数分間設定することは可能です。
代わりに、すべてのハンドシェイクでサーバー側の状態を復元することもできます。これは、 "/ meta/handshake"にリスナーを追加し、 "/ service /"チャネルにメッセージを公開する(サーバーだけがメッセージを受け取るようにする)か、または "ext"ハンドシェイクメッセージのプロパティ。クライアントに有効な状態のみを復元させるように注意してください(必要な場合はサーバーに署名してください)。
3)本当にクライアントとcometDサーバーの両方で2つの拡張を追加するだけでよいですか?私はあなたがOyatelでそれを行うだろうか分からない
bayeux.addExtension(new AcknowledgedMessagesExtension());
:サーバー上
のような何かをするのに十分です。 Javascriptでは、simply include the extension(dojo.requireまたはjQueryのスクリプトが含まれています)で十分です。 AckExtensionとクライアントがサーバーに接続すると
、次のようなメッセージは、(私の桟橋コンソールログから)記録されます。
[qtp959713667-32] INFO org.cometd.server.ext.AcknowledgedMessagesExtension - Enabled message acknowledgement for client 51vkuhps5qgsuaxhehzfg6yw92
別のノートでは、それは明らかではないかもしれませんので、 :ack拡張機能は、サーバーからクライアントへの配信ではなく、サーバーへの配信保証のみを提供します。つまり、クライアントからサーバーにメッセージをパブリッシュすると、サーバーに到達せずに失われてしまうことがあります。
メッセージがサーバーに送信されると、ack拡張機能はその時点で接続されているすべての受信者が確実にメッセージを受信するようにします(maxIntervalミリ秒で到達できない場合)。
「/ meta/unsuccessful」の通知をリッスンしてメッセージを再送信すると、クライアント側で再試行するのは比較的簡単です(元のメッセージはmessage.requestとしてハンドラに渡されます)。