Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用Servlet状态管理计划作业吗?_Java_Multithreading_Servlets_Scheduled Tasks - Fatal编程技术网

Java 可以使用Servlet状态管理计划作业吗?

Java 可以使用Servlet状态管理计划作业吗?,java,multithreading,servlets,scheduled-tasks,Java,Multithreading,Servlets,Scheduled Tasks,我的web应用程序需要允许不同位置的用户为每个位置安排一个数据导入作业。每项工作可能需要很长时间才能完成。一个位置可以有多个用户同时调度作业(使用不同的调度),在这种情况下,最后提交的调度获胜。可以随时取消和修改计划。此外,还可以随时添加新位置(及其明细表)。我正在使用JDK1.6和原始servlet 鉴于线程安全问题和对servlet状态的依赖,我下面的计划似乎充满了危险信号 计划: 使用ScheduledExecutorService在servlet的init()方法中调度作业。Servle

我的web应用程序需要允许不同位置的用户为每个位置安排一个数据导入作业。每项工作可能需要很长时间才能完成。一个位置可以有多个用户同时调度作业(使用不同的调度),在这种情况下,最后提交的调度获胜。可以随时取消和修改计划。此外,还可以随时添加新位置(及其明细表)。我正在使用JDK1.6和原始servlet

鉴于线程安全问题和对servlet状态的依赖,我下面的计划似乎充满了危险信号

计划:

  • 使用ScheduledExecutorService在servlet的init()方法中调度作业。ServletContextListener通常是建议安排作业的地方,但考虑到HttpRequest可能会到达以更改现有作业的计划,我似乎需要:


  • 使用成员变量
    map跟踪servlet中的计划作业线程,而不是在servlet中执行工作,而是在脱机进程(不属于web应用程序的程序)中执行。让servlet简单地充当脱机进程的触发机制。有多种方法可以完成触发过程(文件传输、共享数据库、消息传递或远程过程调用)。将其视为一个起点

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


    编辑:为了清晰起见进行了编辑。

    我使用过类似的东西。添加信息。到数据库->crontab激发->python代码检查数据库,根据需要处理和更新数据库。->对web应用的下一个请求显示更改。。另外:我从未见过在非基于事务的上下文中使用servlet。@Ross和user4704303,谢谢你的想法。数据库听起来很简单(因为我已经在使用它),但这听起来像是一个轮询解决方案,而不是一个推送,这对我的需求来说并不一定不好。但是,调度程序似乎并没有按照我理解的方式被使用——调度周期性作业。相反,它会安排一个作业来检查是否应该启动一个新作业。我想远程程序会是一种推动,但我不确定我是否要设置它。我本来打算写一个答案,但只是没有足够的知识来给出一个我完全有信心的足够质量的答案。我可以说的是,我确实认为它对于同步是有效的,因为servlet是多线程的,并且该变量将发生变化。我认为您不需要在servlet中使用init()方法。在ServletContextListener的帮助下定义ScheduledExecutorService(更多信息,请参见:stackoverflow.com/q/4691132/539394),您可以使用servlet中的getServletConfig()方法访问它?消除了对servlet变量的需要。。例外情况下会发生什么: