2

SpringMVCとAtmosphereフレームワークを統合したシンプルで小さな例を作成することに成功しました。それは非常にうまく機能しますが、私が理解していないように動作します:

私のtryの例ではDate、10秒ごとに文字列をブロードカストしようとしているので、アプリを10:10:20に起動すると、次のメッセージは10:10:30などになります。

しかし、その代わりに、この期間内に4つのコールバックがあるため、メッセージフローは次のようになります:10:10:20、10:10:21、10:10:22、10:24、10:10:3​​0。この動作は、同じ時間帯で順番に発生します。

10秒ごとに1回ではなく、10秒で4回のコールバックがあるのはなぜですか?

私の関連するコードは次のとおりです。

 @RequestMapping(value="/websockets", method=RequestMethod.GET)
 @ResponseBody
 public void websockets(final AtmosphereResource<HttpServletRequest,HttpServletResponse> event) {

      final HttpServletRequest  req = event.getRequest();
        final HttpServletResponse res = event.getResponse();
        event.suspend();

        final Broadcaster bc = event.getBroadcaster();
        bc.scheduleFixedBroadcast(new Callable<String>() {

            public String call() throws Exception {

                return (new Date()).toString();
            }
        }, 10, TimeUnit.SECONDS);
 }

そして私のクライアントコードで私は次のことをしています:

<script type="text/javascript">
$(document).ready(function() {
     var callbackAdded = false;

          function callback(response)
          {

              $.atmosphere.log('info', ["response.state: " + response.state]);
              $.atmosphere.log('info', ["response.transport: " + response.transport]);

              if (response.transport != 'polling' && response.state != 'connected' && response.state != 'closed') {
                  $.atmosphere.log('info', ["response.responseBody: " + response.responseBody]);
                  if (response.status == 200) {
                      var data = response.responseBody;

                      if (data) {
                          $("#date").text(data);
                      }
                  }
              }
          }
          $.atmosphere.subscribe("websockets",
                  !callbackAdded? callback : null,
          $.atmosphere.request = {transport: 'websocket'});
          connectedEndpoint = $.atmosphere.response;
          callbackAdded = true;
});
</script>
4

2 に答える 2

1

ノンブロッキングサポートを追加した後、Webアプリケーションから次のメッセージが表示されます。

60347 [http-nio-8080-exec-1] WARN org.atmosphere.cpr.AtmosphereServlet - failed
using comet support: org.atmosphere.container.TomcatCometSupport, error: Tomcat
failed to detect this is a Comet application because context.xml is missing or t
he Http11NioProtocol Connector is not enabled.
If that's not the case, you can also remove META-INF/context.xml and WEB-INF/lib
/atmosphere-compat-tomcat.jar
60348 [http-nio-8080-exec-1] WARN org.atmosphere.cpr.AtmosphereServlet - Using B
lockingIOCometSupport.
60401 [http-nio-8080-exec-1] INFO com.hillert.atmosphere.HomeController - Welcom
e home!

そして、このメッセージの後に、以前のようにタイムアウトエラーが発生します。ログから、サーバーがhttp-nio-8080を使用していることがわかります。私は今どうすればいい ?

于 2011-11-23T09:50:24.767 に答える
0

私はこれがあなたのコードの何が問題なのか知っています。ブロードキャストスレッドを開始するすべてのリクエストは、10秒ごとに日付をブロードキャストします。新しいリクエストを送信する(新しいブラウザを起動する)たびに、新しいスレッドが開始されます。残念ながら、スレッドは決して停止しないようです。Atmosphereがそのようなケースをどのように処理するのかわかりません。ブロドキャストスレッドを停止する責任は誰にありますか。これについてもっと読みます。私が言ったことを簡単にテストし、Webサーバーを再起動し、1つのブラウザーを起動するだけで、10秒ごとに1つの呼び出しだけが表示されるはずです。私の場合、このように機能します。2番目と3番目のブラウザを起動すると、ブラウザクライアントと同じ回数のブロドキャストが表示されます。ブラウザクライアントを閉じるのをやめた後、Webサーバーがbrodcastスレッドを停止することはありません。

2番目のケースは、実際には10秒の待機時間ではなく1秒しかなかった場合です。これはTomcatでしか再現できなかったので、別のWebサーバーであるJBOSS7.0を試していました。JBOSSを使用すると、常に再現可能でした。最初の問題は、2番目のブラウザリクエストを開始した場合に残り、2番目に2回の呼び出しが発生します:)。

于 2011-11-24T17:07:06.800 に答える