【发布时间】:2015-09-03 11:18:22
【问题描述】:
我的 Web 应用程序需要允许不同位置的用户可能为每个位置安排一项数据导入作业。每项工作可能需要很长时间才能完成。一个位置可能有多个用户可以同时安排作业(使用不同的时间表),在这种情况下,最后提交的时间表胜出。可以随时取消和修改计划。此外,可以随时添加新位置(及其时间表)。我正在使用 JDK 1.6 和原始 servlet。
鉴于线程安全问题和对 servlet 状态的依赖,我的以下计划似乎充满了危险。
计划:
使用 ScheduledExecutorService 在 servlet 的 init() 方法中调度作业。 ServletContextListener 是通常推荐的安排作业的地方,但鉴于 HttpRequest 可能会到达以更改现有作业的日程安排,我似乎需要:
使用成员变量
map<location, ScheduledFuture<?>>跟踪 servlet 中计划的作业线程。我知道在 servlet 中保持状态被认为是不好的,但就我而言,这似乎是必要的,以便我可以:取消计划的作业线程,并在用户请求时使用已知位置作为上面地图的键重新计划它。这部分似乎需要同步块,但块应该快速执行,同时访问应该仅限于少数用户。 这似乎是使用同步的有效用例吗?
可以使用 Servlet 状态管理计划作业吗?您在我的计划中发现了哪些漏洞,以及按照我的意愿做事的更好方法是什么?
谢谢!
【问题讨论】:
标签: java multithreading servlets scheduled-tasks