web-dev-qa-db-ja.com

Atmosphereを使用してプッシュ通知を設計する方法

雰囲気を利用して通知システムを開発したい。

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

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

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

今、私は受信者がこのメッセージをどのように受信できるかを理解することができません。

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

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

14
Saurabh Kumar

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

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

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

つまり、サーブレットまたはフィルタの場合、HttpServletRequestAtmosphereResource を追加できるようにする必要があります。

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

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

サーバー側では、通知をサブスクライブするエンドポイントをクライアントに提供する必要があります。たとえば、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. サーバーはリクエストを受信し、接続を一時停止してどこかに保存します(コードまたはBroadcasterのいずれか)。
  3. 何かが起こると、サーバーは一時停止された接続を探し、その中で通知を送信します。
  4. クライアントは通知を受け取り、コールバックが呼び出されます。
  5. 利益!!!

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

24
elusive-code

AtmosphereはWebSocketをサポートしています。 Javaクライアントを作成したい場合は、試してみてください https://github.com/TooTallNate/Java-WebSocket

独自のWebSocketクライアントの作成のセクションを参照してください

0
Dario