gpt4 book ai didi

java - 如何使用来自 InterruptableJob 接口(interface)的覆盖中断方法终止当前运行的 quartz 作业?

转载 作者:行者123 更新时间:2023-12-05 07:10:38 25 4
gpt4 key购买 nike

我有一些 quartz 作业来处理一些数据。我在编写这些作业时使用了 InterruptableJob 接口(interface)。我必须为这些作业添加中断功能。当用户按下终止按钮时,此方法调用:

@Override
protected void immediatelyTerminate() {

try {

String fireInstanceIdToKillJob = "";

Scheduler scheduler = schedulerFactory.getScheduler();
List<JobExecutionContext> currentlyExecutingJobs = scheduler.getCurrentlyExecutingJobs();

for(JobExecutionContext jec : currentlyExecutingJobs) {
if(jec.getJobDetail().getKey().getName().contains(specificJobKey) {
fireInstanceIdToKillJob = jec.getFireInstanceId();
}
}

scheduler.interrupt(fireInstanceIdToKillJob);

} catch (Exception e) {
logger.debug("error in immediatelyTerminate() method:" + e);
}
}

scheduler.interrupt 调用类中重写的 interrupt() 方法,该类也有 execute 方法。重写了中断方法的类是这样的:

private Thread threadToKill;

@Override
public void execute() {
threadToKill = Thread.currentThread();
}

@Override
public void interrupt() throws UnableToInterruptJobException {
try {
threadToKill.interrupt();
} catch (Exception e) {
System.out.println("Exception handled "+e);
}
}

但是使用这段代码,作业不会终止,它会继续工作。 threadToKill.interrupt();行实际上并没有终止正在运行的作业。

如何终止正在运行的作业?

最佳答案

我在几年前实现了这个完全相同的功能。

Interrupting a thread does not kill it nor stop it .它只是激活一个标志,以便线程知道它已被要求停止。大多数内部方法会对此进行检查并抛出一个 InterruptedException 供您捕获它,但有些线程会很高兴地忽略任何中断请求。
因此,检测这种情况并采取相应行动取决于工作本身。

基本上,您的 interrupt() 方法应该将一些标志设置为 true,并且您的作业应该时不时地检查这个标志,并在它注意到时停止正在做的任何事情该标志已激活。
我是这样实现的:

public clas SomeJob implements InterruptableJob {

protected AtomicBoolean stopFlag = new AtomicBoolean(false);

@Override
public void execute(final JobExecutionContext context) {
for (Item item : listOfItems) { // whatever long tasks(s) you are doing,
if (stopFlag.get()) { // just check for this on every main loop
logger.error("Job interrupted! Leaving at item: "+item);
break;
}
performTask(item);
}
cleanUp();
return;
}

private void performTask(Item item) {
for(....) { // another loop,
if (stopFlag.get()) { // another check
// ....
return; // or break, depending on each case
}
someInternalProcessing(...);
}
}

@Override
protected void interrupt() {
stopFlag.set(true);
}
}

就是这样。只需确保在中止之前清理、关闭连接等。

关于java - 如何使用来自 InterruptableJob 接口(interface)的覆盖中断方法终止当前运行的 quartz 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61153657/

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