2

私がやろうとしていること: ユーザーが多数の異なる「チャット ルーム」にサブスクライブし、リバース AJAX / comet を使用して、チャット ルームからそのルームにログインしている全員にメッセージを送信できるようにします。(もう少し複雑ですが、これは同様の使用例です)。

私がやっていること: JMS と Atmosphere で Grails を使用しています。メッセージが送信されると、JMS を使用してメッセージ オブジェクトを送信します。このメッセージ オブジェクトは Grails サービスによって受信され、大気 URL (つまり、大気/メッセージ) にブロードキャストされます。

明らかにJMSは少し冗長ですが、メッセージを取得する必要がある人をフィルタリングするのに使用できますが、実際には機能しないようです(サブスクライバーが基本的にシングルトンサービスであることを考えると...)。

とにかく、私ができる必要があるのは、雰囲気/メッセージを聞いている人々の正しいサブセットにメッセージを送ることだけです. ここでは RESTful タイプの URL が最適です (つまり、atmosphere/messages/* (* はルーム ID)) が、Atmosphere でそれを行う方法がわかりません。

私が望むものをどのように達成できるかについてのアイデア/提案はありますか? ここには具体的なものは何もありませんので、何でも自由に提案してください。私は(別の質問への回答に基づいて)考えていました。

4

3 に答える 3

5

あなたの要件を正しく理解していれば、次のように動作するはずです (jax-rs + scala コード):

1) チャット ルームからメッセージを受け取りたい人は全員登録します。

@GET
@Path(choose/a/path)
def register(@QueryParam("chatroomId") chatroomId: Broadcaster) {
  // alternatively, the Suspend annotation can be used
  new SuspendResponse.SuspendResponseBuilder[String]()
          .resumeOnBroadcast(false).broadcaster(chatroomId).scope(SCOPE.REQUEST)
          .period(suspendTimeout, TimeUnit.MINUTES)
          .addListener(new AtmosphereEventsLogger()).build
}

2) すべての登録ユーザーにメッセージをブロードキャストするには、次のメソッドを呼び出します。

@POST
@Broadcast
@Path(choose/a/path/{chatroomId})
def broadcast(@PathParam("chatroomId") id: String) {
  // first find your broadcaster with the BroadcasterFactory
  BroadcasterFactory.getDefault().lookupAll() // or maybe there is a find by id?
  broadcaster = ...
  broadcaster.broadcast(<your message>)
}

また、大気のホワイトペーパーメーリング リスト、およびJeanfrancois Arcand のブログを読むことをお勧めします。

それが役立つことを願っています。

于 2011-08-26T09:08:19.360 に答える
2

彗星の概念の誤解があります。パブリッシュ/サブスクライブのもう 1 つの実装です。複数のチャット ルームがある場合は、複数の「トピック」、つまりユーザーが登録できる複数のチャネルが必要です。例えば:

broadcaster['/atmosphere/chatRoom1'].broadcast('Hello world!')

broadcaster['/atmosphere/chatRoom2'].broadcast('Hello world!')

したがって、複数のチャネルを作成し、メッセージを取得する必要がある一連のユーザーを手動でフィルタリングしないようにしてください (これは、絶対に行うべき方法ではありません)。ユーザーは特定のチャネルに登録してメッセージを受信するだけなので、サーバー側で何かを作成する必要はありません。

于 2011-08-26T09:16:41.163 に答える
0

/ atmosphere / chat-roomのような1つのURLに対してAtmosphereHandlerを作成してから、At​​mosphereResourceを使用してBroadcastFilterをバインドし、ChatRoomBroadcastFilterという名前を付けることをお勧めします。

ユーザーが新しいチャットルームにサブスクライブするたびに、(クライアントから)サーバーにサブスクリプションについて通知するメッセージが送信されます。サブスクライブしたら、サーバー上のどこかにユーザーの<>チャットルームバインディングのリストを維持します。

メッセージがブロードキャストされるときはいつでも、チャットルームIDを使用してメッセージをブロードキャストします。ChatRoomBroadcastFilter(おそらくこれをPerRequestBroacastFilterにする必要があります)は、ユーザーがチャットルームにサブスクライブしている場合にのみ、メッセージをユーザーに伝播します。これで問題が解決するかどうかはわかりません。コード例が必要な場合は、コメントに記載してください。私はそれを置きますが、それはしばらく時間がかかるので、今それを入れていません;)。

于 2012-09-25T11:58:09.243 に答える