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

安排一个Spring批处理作业,以便每4小时重新启动我的应用程序

龚昊然
2023-03-14
@EnableScheduling
public class App {
    private static ConfigurableApplicationContext context;

    private static final Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        BasicConfigurator.configure();
        context = SpringApplication.run(App.class, args);

    }

    @Scheduled(cron = "0 0 0/4 * * * ")
    public static void restart() {
        ApplicationArguments args = context.getBean(ApplicationArguments.class);
        logger.info("##### Scheduler Started #####"+System.currentTimeMillis());

        Thread thread = new Thread(() -> {
            context.close();
            logger.info("***Context Closed***"+System.currentTimeMillis());
            context = SpringApplication.run(App.class, args.getSourceArgs());
            logger.info("###### Context  Restarted "+ 
            System.currentTimeMillis());
        });

        thread.setDaemon(false);
        thread.start();
    }
 }

共有1个答案

罗安宁
2023-03-14

因为方法是在构造函数中调用的,所以它是在bean初始化时调用的,所以每次我都必须重新启动我的应用程序

您不需要为此在每个计划中关闭/重新启动应用程序上下文。您可以在JobExecutionListener#BeforeJob中移动任何初始化代码,这更适合您的用例。

解决这个问题的另一种方法是创建一个调用生成json文件的脚本的tasklet(例如SystemCommandTasklet),然后创建第二个步骤,用json项读取器读取文件(文件名可以通过执行上下文在两个步骤之间共享)。

 类似资料:
  • 我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中

  • 我有一个spring boot应用程序,它应该将数据库(产品)中的一个表导出为文件,所以我使用spring batch来实现这一点,我的问题是,当作业完成时,应用程序重新启动,我认为这是因为spring batch在完成后关闭了实体管理器,但我不确定 注意1:我使用作为Reader。 注意2:我正在使用从controller启动作业 注5:我发现了一个类似问题的问题,但它没有答案和关闭(重复),但

  • 我在一个Spring Boot应用程序中定义了多个Spring批处理作业。例如,job1、Job2。等等。 null

  • 我已经将我的Spring批处理配置为每当通过API调用从UI发出请求时触发作业。我面临的问题是,该作业仅在第一次和其他尝试时工作正常,每当调用时,作业不会以预期的方式响应。似乎他们正在尝试恢复,但我想再次重新启动整个执行。感谢您提前提供的任何帮助。 主要的班 配置班 JobListener.class 我的听众。班 Controller.class 应用属性 首次发出API请求时的响应 其他时间的

  • 我需要从远程SFTP服务器下载一个文件,并使用spring batch处理它们。我已经实现了使用Spring集成下载文件的代码。但我无法从Spring集成组件启动Spring批处理作业。我有以下代码: 但这不起作用(上一个方法中的错误),因为找不到文件类型的bean。我不能把这两部分连在一起。如何连接集成和批处理?

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。