gpt4 book ai didi

java - Quartz 作业已完成但线程仍处于阻塞状态

转载 作者:行者123 更新时间:2023-12-03 23:13:35 25 4
gpt4 key购买 nike

我有一个这样的 Quartz Job

@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);

作业每分钟触发一次。它运行良好约 1 周(10000 次执行)并且莫名其妙地没有重新启动。日志中没有错误,看到它已经完成了前面的执行。其他进程正在正确触发。

将库升级到 quartz-2.2.3commons-net-3.5(寻找 FTP 库中可能存在的错误)我设法持续了 3 周

我有一个 Job 来监视 Scheduler,它说触发状态是 BLOCKED。阻塞进程的Thread没有被应用服务器重用

 TriggerState triggerState = scheduler.getTriggerState(triggerKey);

我还没有找到关于 Quartz 此类问题的文档,所以我怀疑是 FTP 库中的一个错误干扰了 quartz 启动的线程,例如使用 @PersistJobDataAfterExecution

我想知道这是一个已知问题还是一个错误,所以我可以应用解决方案或解决方法(终止 quartz 作业 how to stop/interrupt quartz scheduler job manually)

最佳答案

几个月来偶尔出现服务中断并怀疑 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 作业已完成但线程仍处于阻塞状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com