Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导正常关闭-在作业完成之前关闭数据源_Java_Spring_Database_Spring Boot - Fatal编程技术网

Java Spring引导正常关闭-在作业完成之前关闭数据源

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发布 有人能帮我解决这个问题吗?我试

我已经使用Spring boot应用程序实现了一个计划作业。此后台计划作业执行一些数据库操作。现在的问题是,在关闭应用程序时,job keep将继续其处理,但与数据源的连接已关闭

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