在基于Spring 3 + Tiles的Web应用程序中添加Timer(for Task Schedule)的正确方法是什么?

时间:2013-02-27 05:25:06

标签: spring java-ee spring-mvc apache-tiles

我想知道是否有任何正确的方法可以在Spring 3 + Tiles中为任务计划添加计时器(它会计数),这些计时器工作正常。我已经尝试过很多选项,比如jquery timer +(客户端)Quartz(服务器端线程),但是虽然它不准确,但我们可以说它对Web应用程序来说是不好的做法。 我想要(想要管理)的是我的Web应用程序(Spring 3 + Tiles),当用户点击计时器启动时,它应该在客户端启动,计时器应该继续,直到用户点击停止,但是用户可以做Web应用程序中的任何其他内容(如导航到任何其他页面)但计时器应该以静态方式工作。有很多问题好像我只在客户端实现计时器(使用cookie,jquery会话客户端)而不是我必须管理如果用户导航到另一个页面然后再次计时器必须从之前的时间开始存储在cookie中但是这样做会导致请求响应过程中的秒数丢失。所以我也尝试使用quartz实现服务器端计时器,但是我必须在Web应用程序的每次单击时将其与客户端计时器同步。所以我的感觉再一次糟糕。 那么我可以在Spring 3 + tile中引入任何可以是静态的并且可以以静态方式保存计时器的东西。

提前完成。

1 个答案:

答案 0 :(得分:2)

好的,所以你需要简单的单词Server Push。你可以使用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;
  };

只需暂停获取请求并以常规方式广播当前时间,您可以根据需要对此进行扩展。我刚刚给了您一个原创的想法。希望这有帮助。