基本的に必要なのは、Atmosphere の上にPublish-subscribeを実装することです。
Atmosphere は、クライアント側 (JavaScript ベース) とサーバー側 (Java ベース) の 2 つの部分で構成されます。
まず、サーバー側を構成する必要があります: Atmosphere のインストール
つまり、サーブレットまたはフィルターであり、 AtmosphereResourceをHttpServletRequestに追加できるようにするために必要です。
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);
要約すると、次のようになります。
- クライアントは「この種の通知を受け取りたい」というリクエストを送信します。
- サーバーはリクエストを受け取り、接続を一時停止してどこかに保存します(コードまたはブロードキャスターのいずれか)。
- 何かが起こると、サーバーは中断された接続を探し、その中で通知を送信します。
- クライアントが通知を受け取り、コールバックが呼び出されます。
- 利益!!!
この wikiには、Atmosphere の背後にあるいくつかの概念の説明と、他のドキュメントへのリンクがあります。