0

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

只需暂停获取请求并定期广播当前时间,您可以根据需要扩展它我刚刚给了您一个原始想法。希望这会有所帮助。

于 2013-02-27T09:02:43.310 回答