16

雰囲気を使って通知システムを開発したいです。

私は Atmosphere に非常に慣れていないので、どこかで間違っていたら申し訳ありません。私が理解したのは、アクターが何かを公開すると、通知アクションをデータベースに保存するということです。受信者がこれらの通知をリアルタイムで受け取る方法がわかりません。

私が知っている送信者は、次のようなことをします

event.getBroadcaster().broadcast(
            objectMapper.writeValueAsString("Some Message"));

今、受信者がこのメッセージを受信する方法を理解できません。

例えば ​​。ユーザー オブジェクトをフレンドとして追加したいと考えています。したがって、User1 が User2 User1 ブロードキャストを追加すると、通知を User2 にプッシュする方法よりも多くなります。私はこれを理解するのに苦労しています。

技術的には、FacebookやGmailの通知のように、ユーザーのアクティビティで他のユーザーが通知を受け取るようなものが必要です。

4

1 に答える 1

26

基本的に必要なのは、Atmosphere の上にPublish-subscribeを実装することです。

Atmosphere は、クライアント側 (JavaScript ベース) とサーバー側 (Java ベース) の 2 つの部分で構成されます。

まず、サーバー側を構成する必要があります: Atmosphere のインストール

つまり、サーブレットまたはフィルターであり、 AtmosphereResourceHttpServletRequestに追加できるようにするために必要です。

AtmosphereResourceは、サーバー側の単一のクライアント接続を表します。

ブロードキャスターは実際にはこれらのリソースのコンテナーであるため、複数の接続に送信する必要がある場合にルックアップ/反復/同時実行を処理する必要はありません。(1 つのクライアントで複数の接続を生成できることに注意してください)。

サーバー側では、通知をサブスクライブするためのエンドポイントをクライアントに提供する必要があります。たとえば、Spring-MVC を使用している場合は、次のようになります (検証/認証などを省略します)。

@RequestMapping(value = "/user-notifications/{userId}")
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public void watch(@PathVariable("userId") String userId,
                  HttpServletRequest request) throws Exception {
    //Atmosphere framework puts filter/servlet that adds ATMOSPHERE_RESOURCE to all requests
    AtmosphereResource resource = (AtmosphereResource)request.getAttribute(ApplicationConfig.ATMOSPHERE_RESOURCE);

    //suspending resource to keep connection
    resource.suspend();

    //find broadcaster, second parameter says to create broadcaster if it doesn't exist
    Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup(userId,true);

    //saving resource for notifications
    broadcaster.addAtmosphereResource(resource);
}

何かが発生した場合、次のようにクライアントに通知できます。

public void notify(User user, Event event){
    Broadcaster b = BroadcasterFactory.getDefault().lookup(user.getId());
    if (b!=null){
        b.broadcast(event);
    }
}

クライアント側では、次のように、サブスクライブ リクエストを送信し、後続のイベントをリッスンする必要があります。

var request = new atmosphere.AtmosphereRequest();
request.url = '/user-notifications/'+userId;
request.transport = 'websocket';
request.fallbackTransport = 'streaming';
request.contentType = 'application/json';
request.reconnectInterval = 60000;
request.maxReconnectOnClose = 1000;
request.onMessage = function(response){
    console.log(response);
    alert('something happend<br>'+response);
};
that.watcherSocket = atmosphere.subscribe(request);

要約すると、次のようになります。

  1. クライアントは「この種の通知を受け取りたい」というリクエストを送信します。
  2. サーバーはリクエストを受け取り、接続を一時停止してどこかに保存します(コードまたはブロードキャスターのいずれか)。
  3. 何かが起こると、サーバーは中断された接続を探し、その中で通知を送信します。
  4. クライアントが通知を受け取り、コールバックが呼び出されます。
  5. 利益!!!

この wikiには、Atmosphere の背後にあるいくつかの概念の説明と、他のドキュメントへのリンクがあります。

于 2013-11-21T14:23:05.323 に答える