6

Spring MVCアプリでAtmosphereを使用して、streamingトランスポートを使用してプッシュを容易にしています。

私のアプリのライフサイクル全体を通して、クライアントはさまざまなトピックのサブスクライブとサブスクライブ解除を行います。

Atmosphereは、サブスクリプションごとに1つのhttp接続を使用しているようです。つまり、を呼び出すたびに$.atmosphere.subscribe(request)新しい接続が作成されます。これにより、ブラウザから大気サーバーへの接続数がすぐになくなります。

毎回新しいリソースを作成するのではなく、AtmosphereResource最初の作成後に放送局に追加および削除できるようにしたいと思います。

ただし、AtmosphereResourceはインバウンドリクエストの1対1の表現であるため、クライアントがサーバーにリクエストを送信するたびに、新しいリソースに到着しますAtomsphereResource。つまり、元のリソースを参照して、に追加する方法がありません。トピックのBroadcaster

両方を使用して、元の呼び出しから返されたリソース$.atmosphere.subscribe(request)を呼び出してみました。ただし、これによる違いはありません。atmosphereResource.push(request)subscribe()

これにアプローチする正しい方法は何ですか?

4

1 に答える 1

9

これが私がそれを機能させた方法です:

まず、クライアントが最初の接続を行うときに、次を呼び出す前に、雰囲気固有のヘッダーがブラウザーによって受け入れられることを確認しますsuspend()

@RequestMapping("/subscribe")
public ResponseEntity<HttpStatus> connect(AtmosphereResource resource)
{
    resource.getResponse().setHeader("Access-Control-Expose-Headers", ATMOSPHERE_TRACKING_ID + "," + X_CACHE_DATE);
    resource.suspend();
}

次に、クライアントが追加のサブスクライブ要求を送信すると、それらは別のサブスクライブ要求を受信しますが、元のリソースのがresource含まれます。これにより、 :ATMOPSHERE_TRACKING_IDを介して検索できます。resourceFactory

@RequestMapping(value="/subscribe", method=RequestMethod.POST)
public ResponseEntity<HttpStatus> addSubscription(AtmosphereResource resource, @RequestParam("topic") String topic)
{
    String atmosphereId = resource.getResponse().getHeader(ATMOSPHERE_TRACKING_ID);
    if (atmosphereId == null || atmosphereId.isEmpty())
    {
        log.error("Cannot add subscription, as the atmosphere tracking ID was not found");
        return new ResponseEntity<HttpStatus>(HttpStatus.BAD_REQUEST);
    }
    AtmosphereResource originalResource = resourceFactory.find(atmosphereId);
    if (originalResource == null)
    {
        log.error("The provided Atmosphere tracking ID is not associated to a known resource");
        return new ResponseEntity<HttpStatus>(HttpStatus.BAD_REQUEST);
    }

    Broadcaster broadcaster = broadcasterFactory.lookup(topic, true);
    broadcaster.addAtmosphereResource(originalResource);
    log.info("Added subscription to {} for atmosphere resource {}",topic, atmosphereId);

    return getOkResponse();
}
于 2012-12-13T19:55:21.183 に答える