我的 Web 应用程序需要允许不同位置的用户为每个位置安排一项数据导入作业。每项工作可能需要很长时间才能完成。一个位置可以有多个用户可以同时安排作业(使用不同的计划),在这种情况下,最后提交的计划胜出。时间表可以随时取消和修改。此外,可能会随时添加新地点(及其时间表)。我正在使用 JDK 1.6 和原始 servlet。
考虑到线程安全问题和对 servlet 状态的依赖,我的下面的计划似乎充满了危险信号。
计划:
使用 ScheduledExecutorService 在 servlet 的 init() 方法中调度作业。 ServletContextListener 是通常推荐的安排作业的位置,但考虑到 HttpRequest 可能会到达并更改现有作业的安排,看来我需要:
使用成员变量
map<location, ScheduledFuture<?>>
跟踪 servlet 中的预定作业线程。我知道在 servlet 中保留状态被认为是不好的,但就我而言,似乎需要这样做,以便我可以:取消计划的作业线程,并在用户请求时使用已知位置作为上面 map 的键来重新安排它。这部分似乎需要同步块(synchronized block),但该 block 应该快速执行,并且同时访问应该仅限于少数用户。 这看起来是使用同步的有效用例吗?
可以使用 Servlet 状态管理计划作业吗?您认为我的计划有哪些漏洞?什么是更好的方法来实现我想要的目标?
谢谢!
最佳答案
不要在 servlet 中执行此操作,而是在离线进程(不属于 Web 应用程序的程序)中执行此操作。让 Servlet 仅充当离线进程的触发机制。有多种方法可以完成触发过程(文件传输、共享数据库、消息传递或远程过程调用)。请参阅enterprise integration patterns作为起点。
在离线程序中进行处理的好处是您不需要管理 servlet 中的状态,并且它会产生更加模块化的代码。
编辑:为了清晰起见进行了编辑。
关于java - 是否可以使用 Servlet 状态来管理计划作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904842/