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

石英作业已完成,但线程仍被阻塞

邹博明
2023-03-14
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class MyJob{

     public void execute(JobExecutionContext jec) throws JobExecutionException {
         //connect to a FTP server, monitor directory for new files and download
         //Using FTPClient of commons-net-3.5.jar 
     }
JobDetail jobDetail = newJob(MyJob.class)
    .withIdentity(jobName, DEFAULT_GROUP)
    .usingJobData(new JobDataMap(jobProperties))
    .build();   

//trigger every minute                  
Trigger trigger = newTrigger()
    .withIdentity(jobName, DEFAULT_GROUP)
    .startNow()
    .withSchedule(cronSchedule(cronExpression))
    .build();

scheduler.scheduleJob(jobDetail,trigger);

将库升级到quartz-2.2.3commons-net-3.5(查找FTP库中可能的bug)我设法持续了3周

我有一个作业要监视调度器,该作业表示触发器状态为blocked。应用程序服务器不重用阻塞进程的线程

 TriggerState triggerState = scheduler.getTriggerState(triggerKey);

我没有找到关于Quartz这类问题的文档,因此我怀疑是FTP库中的bug干扰了Quartz启动的线程,例如@persistjobdataAfterExecution的使用

共有1个答案

符学
2023-03-14

在经历了几个月偶尔出现的服务中断并怀疑FTP连接错误阻止了服务之后,我们终于实现了一个似乎可以解决问题的措施

每个进程现在执行

FTPClient ftp = new FTPClient();

//Added connection timeout before connect()
ftp.setDefaultTimeout(getTimeoutInMilliseconds());  

ftp.connect(host, port);

//Added more timeouts to see if thread locks disappear...
ftp.setBufferSize(1024 * 1024);
ftp.setSoTimeout(getTimeoutInMilliseconds());   

奇怪的是,进程以前在connect()中没有被阻止,进程继续并在没有重新启动的情况下结束,但当设置超时时,问题不再发生

 类似资料:
  • 我正在使用一个使用Java的Quartz调度器。即使计划的时间已经过了,它也不会抛出调度器异常,而是现在运行作业。例如,我确认了一个作业是10月10日,今天是10月30日,如果我保存信息,它现在就运行作业本身 此外,我还使用JobListener实现手动触发一个作业,以便以后在同一时间点运行其他作业的情况下对其进行调度。 请帮忙。

  • 我有一个Sprint Boot-Java8应用程序,它有一个quartz作业,我在启动时配置该作业并设置一个时间表。该作业按照计划自动运行,这与您对quartz作业的期望一样。然而,现在我希望能够允许用户通过点击前端上的一个按钮手动触发这些作业,而不会扰乱该作业的正常调度。这是我所有的相关档案。 但每次运行应用程序并点击控制器的方法时,都会在控制台中出现以下错误: 我到底做错了什么?如何使此作业按

  • 问题内容: 这应该真的很容易。我使用的是在Apache Tomcat 6.0.18下运行的Quartz,我有一个jobs.xml文件,该文件设置了每分钟运行的计划作业。 我想做的是,如果下一个触发时间到来时该作业仍在运行,则我不想启动新作业,因此可以让旧实例完成。 有没有办法在Jobs.xml中指定此设置(防止并发实例)? 如果不是,是否可以共享我的应用程序Job实现中对内存中单例的访问(这是通过

  • 是否可以添加/删除/修改在Quartz Spring Boot中动态安排的作业(在运行时),由使用我的门户的最终用户。由于计划无法从外部访问,我不知道有什么办法。基本上,我需要将所有的时间表信息存储到数据库中并访问它们。Im构建的门户将被大量用户使用,实现这一目标的正确解决方案是什么? 否则我可以像下面这样使用cron吗 每5 mns扫描一次作业以实现此目的。

  • 我正在使用quartz调度器来调度一个Spring批处理作业。应用程序启动时没有任何异常,但它从不激发任何作业。 它运行得很成功,但经过更多的开发后,它停止了工作。我无法弄清楚我到底改变了什么配置导致了这一点。 有谁可以建议检查点在使用“JobRepositoryFactoryBean”,如果我没有或问题在其他地方。

  • 使用spring 2.5和quartz 1.6.2,我一直试图每分钟触发一个计划任务 我的xml文件是: 我的代码是: