使用Servlet状态管理预定作业是否可以?

时间:2015-06-18 00:55:41

标签: java multithreading servlets scheduled-tasks

我的网络应用需要允许不同位置的用户可能为每个位置安排一次数据导入作业。每项工作可能需要很长时间才能完成。一个位置可能有多个用户可以同时安排作业(使用不同的时间表),在这种情况下,上次提交的时间表胜出。可以随时取消和修改时间表。此外,可以随时添加新位置(及其时间表)。我正在使用JDK 1.6和原始servlet。

鉴于线程安全问题以及对servlet状态的依赖,下面的计划似乎充满了红色标记。

安排:

  1. 使用ScheduledExecutorService在servlet的init()方法中调度作业。 ServletContextListener是一般推荐的安排工作的地方,但考虑到HttpRequest可能会到达以改变现有工作的时间表,似乎我需要:

  2. 使用成员变量supersonic.ui.views.find("viewIdYouSet").then( function(startedView) { supersonic.ui.layers.push(startedView); }); 跟踪servlet中的预定作业线程。我知道将状态保存在servlet中会被认为是不好的,但在我的情况下,似乎需要以便我可以:

  3. 取消预定作业线程,并在用户请求时使用已知位置作为上述地图的关键字重新安排。这部分似乎需要同步块,但块应该快速执行,同时访问应限于少数用户。 这似乎是使用同步的有效用例吗?

  4. 使用Servlet状态管理预定作业是否可以?你在我的计划中看到了哪些漏洞以及如何更好地做我想做的事情?

    谢谢!

1 个答案:

答案 0 :(得分:1)

而不是在servlet中完成工作,而是在脱机过程(不属于web-app的程序)中进行。让servlet只是作为离线进程的触发机制。有多种方法可以完成触发过程的完成(文件传输,共享数据库,消息传递或远程过程调用)。请参阅enterprise integration patterns作为起点。

在脱机程序中进行处理的好处是,您不需要在servlet中管理状态,这会导致更多的模块化代码。

编辑:为清晰起见而编辑。