Java Spring引导正常关闭-在作业完成之前关闭数据源
我已经使用Spring boot应用程序实现了一个计划作业。此后台计划作业执行一些数据库操作。现在的问题是,在关闭应用程序时,job keep将继续其处理,但与数据源的连接已关闭Java Spring引导正常关闭-在作业完成之前关闭数据源,java,spring,database,spring-boot,Java,Spring,Database,Spring Boot,我已经使用Spring boot应用程序实现了一个计划作业。此后台计划作业执行一些数据库操作。现在的问题是,在关闭应用程序时,job keep将继续其处理,但与数据源的连接已关闭 @Scheduled(cron = "...............") public void process() { . } org.springframework.boot spring启动程序父级 2.3.3.2发布 有人能帮我解决这个问题吗?我试
@Scheduled(cron = "...............")
public void process() {
.
}
org.springframework.boot
spring启动程序父级
2.3.3.2发布
有人能帮我解决这个问题吗?我试着给你一些建议来解决你的问题。如果这对你没有帮助,请原谅我 方法:在应用程序关闭之前,我们需要先停止所有任务 问题:无法取消或停止任务。在这种情况下,我们无法很好地停止已执行的任务。 假设:任务可以停止 步骤1:我们需要管理应用程序中的所有任务。 为了管理应用程序中的任务,我们需要实现
ThreadPoolTaskScheduler
并重写任务执行方法。下面的代码是一个简单的示例
@Service
public class CustomTaskScheduler extends ThreadPoolTaskScheduler {
private final Map<Object, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
public void cancelTask(Object identifier) {
ScheduledFuture future = scheduledTasks.get(identifier);
if (null != future) {
System.out.println("future is not null");
future.cancel(true);
}
}
public void cancelAllTask() {
scheduledTasks.values().forEach(future -> future.cancel(true));
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, period);
ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
// Scheduled annotation only can used for no arguments method so hashCode plus method name is unique.
scheduledTasks.put(runnable.getTarget(), future);
return future;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, startTime, period);
ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
// Scheduled annotation only can used for no arguments method so hashCode plus method name is unique.
scheduledTasks.put(runnable.getTarget(), future);
return future;
}
}
第二种方法:如果您能收到应用程序关闭信号,请调用CustomTaskScheduler的
cancelAllTask()
方法。我尝试给出一些建议来解决您的问题。如果这对您没有帮助,请原谅
方法:在应用程序关闭之前,我们需要先停止所有任务
问题:无法取消或停止任务。在这种情况下,我们无法很好地停止已执行的任务。
假设:任务可以停止
步骤1:我们需要管理应用程序中的所有任务。
为了管理应用程序中的任务,我们需要实现ThreadPoolTaskScheduler
并重写任务执行方法。下面的代码是一个简单的示例
@Service
public class CustomTaskScheduler extends ThreadPoolTaskScheduler {
private final Map<Object, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
public void cancelTask(Object identifier) {
ScheduledFuture future = scheduledTasks.get(identifier);
if (null != future) {
System.out.println("future is not null");
future.cancel(true);
}
}
public void cancelAllTask() {
scheduledTasks.values().forEach(future -> future.cancel(true));
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, period);
ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
// Scheduled annotation only can used for no arguments method so hashCode plus method name is unique.
scheduledTasks.put(runnable.getTarget(), future);
return future;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period) {
ScheduledFuture<?> future = super.scheduleAtFixedRate(task, startTime, period);
ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task;
// Scheduled annotation only can used for no arguments method so hashCode plus method name is unique.
scheduledTasks.put(runnable.getTarget(), future);
return future;
}
}
第二种方法:如果您能收到应用程序关闭信号,请调用CustomTaskScheduler的
cancelAllTask()
方法。谢谢您的回答。我已经尝试过PostDestroy,在达到此方法之前,与数据库的连接已关闭。当与数据库的连接关闭时,我们是否可以收到一些消息,如果可以,则我们可以停止执行新任务,并停止处理任务(如果任务可以回滚,则很好)谢谢您的回答。我已经尝试过PostDestroy,在达到此方法之前,与数据库的连接已关闭。当与数据库的连接关闭时,我们是否可以收到一些消息,如果可以,则我们可以停止执行新任务,并停止处理任务(如果任务可以回滚,则很好)
@PreDestroy
public void clear() {
cancelAllTask();
}