如何定期调用相同的spring mvc控制器方法

时间:2017-08-17 01:17:42

标签: spring-mvc scheduler freemarker

我迫切需要找到一种方法来定期调用@RequestMapping注释的方法。 该项目似乎很简单。但这种简单性需要付出代价。 通过Spring Integration中的poller对象,我可以定期从文件中读取更新的数据。 Spring Poller对象接受我通过读取.properties文件提供的interval属性。定期数据写入@Component,我将其注入控制器以填充模型:

@Autowired
Results results;


@RequestMapping("/")
String exposeResults(ModelMap model) {

    model.addAttribute("errors", results.getErrorCount());
    model.addAttribute("warnings", results.getWarningCount());
    return "results";
}

模型数据通过一些基本的html / jsp显示。 我实际上是在使用FreeMarker时开始关注Spring Boot的一些教程,它为FreeMarker提供了一些特定的启动器。

问题是我无法使html(ftl)自动重新加载以与更新的模型保持一致(它在控制台日志中确实更新,或者如果我手动刷新页面)。

@Scheduled(fixedRate =..)似乎不适用于使用@RequestMapping注释的MVC方法,因为此类方法具有args并返回非void。 而且我不考虑使用jquery ajax获取,因为我没有看到如何将javascript属性作为setInterval(function() {$("#displayarea").load(url); }, 10000);等javascript代码中所需的常量提供...显然像${polling.interval}这样的占位符在这里不起作用。我错了吗?

我必须承认我试图实现`java.util.Observable-Observer'对,但失败了。

我觉得不应该那么复杂,并且会欣赏任何新鲜的想法。 谢谢

1 个答案:

答案 0 :(得分:0)

  

我迫切需要找到一种方法来调用定期使用@RequestMapping注释的方法

你为什么要这样做?!它处理来自服务器客户端的请求,如果您只是从服务器调用它,它将不会更新您的客户端

  

setInterval(function() {$("#displayarea").load(url); }, 10000);

这正是您需要做的${polling.interval}是自由标记语法,它将从名为interval的{​​{1}}或Map中检索polling密钥名为interval的对象的属性,因此您不需要仅polling就足够了。将其设置在您的freemarker模型中,使用freemarker处理具有javascript的文件并完成。

当然,有一些方法可以使用WebSocket来设置来自服务器的推送,但是对于你需要的东西,这将是一种过度杀伤。