当前位置: 首页 > 知识库问答 >
问题:

杀死Tomcat时的Quartz当前执行作业

江丰羽
2023-03-14

有些事我不清楚。假设我每天都有随机安排的作业,每个作业需要30分钟才能运行。假设我有五个这样的工作在运行,而Tomcat被杀了。当我用我的应用程序启动Tomcat时,作业是否会重新启动,或者当前正在运行的作业是否会因为已经启动而丢失?

共有2个答案

刘德义
2023-03-14

Tomcat不关心你的工作。您的任务是在Web应用程序关闭时在其中正确终止作业。

韦俊英
2023-03-14

简而言之,默认情况下,当前正在运行的作业被视为已启动且未恢复

..但您可以在构建作业(JobDetail)时设置requestRecovery属性,以告诉Quartz在崩溃时恢复正在运行的作业,也称为“硬关机”。

引用页面底部的官方留档:

RequestsRecovery-如果作业“请求恢复”,并且它在调度程序的“硬关闭”期间执行(即,它正在运行的进程崩溃,或机器关闭),则在调度程序再次启动时重新执行。在本例中,是JobExecutionContext。isRecovering()方法将返回true。

例如,你可以这样做:

import static org.quartz.JobBuilder.*;

...

JobDetail job = newJob(MyJob.class)
           .withIdentity("myJob", "group1")
           .requestRecovery(true) //This is the guy!
           .build();

...
 类似资料:
  • 问题内容: 当使用and 对象时(提交任务时),如果我为将来的get函数指定一个超时值,则抛出a时基础线程会被杀死吗? 问题答案: 它不是。为什么会这样?除非你告诉。 例如,在有Callable的情况下,存在一个非常有效的担忧。如果您等待结果说20秒钟却没有得到结果,那么您对结果不再感兴趣。那时您应该完全取消任务。 像这样:

  • 我正在尝试使用Quartz来调度运行在GlassFish上的web应用程序中的作业。我在用RamjobStore。问题是,有时调度的作业没有被执行,即使它是在过去或将来被调度的。作业数量非常少,排定程序上一直排定的作业总数不到20个,同时保证最多运行1个作业,所以我假设线程计数不是问题,我可以将它设置为ThreadCount1,它仍然可以工作。在servlet被销毁之前,调度程序也不会被关闭。那么

  • 使用8080/8005等命令删除在任何端口、Windows上运行的tomcat服务

  • 问题内容: 我正在使用Quartz Job执行特定任务。 我也在我的Main应用程序类中安排它的执行,而我试图完成的工作是不允许同时执行此作业的实例。 因此,调度程序仅应在其先前实例完成后才执行作业。 这是我的工作班级: 因此,在应用程序的主类中,我正在启动调度程序: 如果另一个实例仍在运行,我想阻止调度程序启动第二个MainJob实例… 问题答案: 只需在Job类顶部使用Annotation。

  • 问题内容: 我正在用C / C ++ 创建子进程。 当父进程结束(或由于某种原因被杀死)时,我也希望所有子进程也被杀死。 这是系统自动完成的吗?还是我必须自己做? 谢谢。 问题答案: 否。如果父进程被杀死,则子进程将成为init进程的子进程(该进程的进程ID为1,并由内核作为第一个用户进程启动)。 初始化过程会定期检查新的子代,然后等待它们(从而释放由其返回值分配的资源)。

  • 问题是,使用这种方法,会不断增加。