0

Spring 3 + Tilesで正確に機能するタスクスケジュール(カウントアップされる)のタイマーを追加する適切な方法があるかどうかを知りたいです。jquery timer + (Client side) Quartz (Server side Threading) などの多くのオプションを試しましたが、正確ではなく、Web アプリケーションの悪い習慣だと言えます。私が正確に望む (管理したい) のは、Web アプリケーション (Spring 3 + Tiles) にあります。ユーザーがタイマー開始をクリックすると、クライアント側で開始され、ユーザーが停止をクリックするまでタイマーを続行する必要がありますが、ユーザーは実行できますWebアプリケーションの他のもの(他のページへのナビゲーションなど)ですが、タイマーは静的な方法で動作する必要があります。クライアント側でタイマーを実装するだけのように多くの問題があります(Cookieを使用して、jqueryセッションクライアント側)ユーザーが別のページに移動した場合に管理する必要があるよりも、タイマーはCookieに保存された前回から開始する必要がありますが、これを行うと、リクエスト応答プロセス中に秒が失われます。 Quartz を使用してサーバー側のタイマーを実装しますが、Web アプリケーションでクリックするたびにクライアント側のタイマーと同期する必要があります。繰り返しますが、私が感じることは悪い習慣です。だから私が春に導入できるものはありますか 3 + 静的にすることができ、静的な方法でタイマーを保持できるタイル. 繰り返しますが、私が感じることは悪い習慣です。だから私が春に導入できるものはありますか 3 + 静的にすることができ、静的な方法でタイマーを保持できるタイル. 繰り返しますが、私が感じることは悪い習慣です。だから私が春に導入できるものはありますか 3 + 静的にすることができ、静的な方法でタイマーを保持できるタイル.

事前にサンクス。

4

1 に答える 1

2

簡単に言うと、サーバー プッシュが必要です。これを達成するためにAtmosphereを使用できます。環境を Spring MVC と統合するには、このサンプルspring-web-mvc-atmosphereを確認できます。統合後は、サーバー側でこれを行うだけです。

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

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

            public String call() throws Exception {

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


    }

そしてクライアント側から:

function startTimer() {
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("${pageContext.request.contextPath}/user/websockets",
    !callbackAdded? callback : null,
$.atmosphere.request = {transport: 'websocket'});
connectedEndpoint = $.atmosphere.response;
callbackAdded = true;
  };

get リクエストを一時停止し、現在の時刻を定期的にブロードキャストするだけで、必要に応じてこれを拡張できます。

于 2013-02-27T09:02:43.310 に答える