当前位置: 首页 > 面试题库 >

通过Spring编程安排作业(动态设置fixedRate)

侯池暝
2023-03-14
问题内容

目前我有这个:

@Scheduled(fixedRate=5000)
public void getSchedule(){
   System.out.println("in scheduled job");
}

我可以更改它以使用对属性的引用

@Scheduled(fixedRate=${myRate})
public void getSchedule(){
   System.out.println("in scheduled job");
}

但是,我需要使用通过编程获得的值,以便可以在不重新部署应用程序的情况下更改计划。什么是最好的方法?我意识到可能无法使用注释…


问题答案:

使用a Trigger可以动态计算下一次执行时间。

这样的事情应该可以解决问题(从Javadoc@EnableScheduling改编为):

@Configuration
@EnableScheduling
public class MyAppConfig implements SchedulingConfigurer {

    @Autowired
    Environment env;

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override public void run() {
                        myBean().getSchedule();
                    }
                },
                new Trigger() {
                    @Override public Date nextExecutionTime(TriggerContext triggerContext) {
                        Calendar nextExecutionTime =  new GregorianCalendar();
                        Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
                        nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
                        nextExecutionTime.add(Calendar.MILLISECOND, env.getProperty("myRate", Integer.class)); //you can get the value from wherever you want
                        return nextExecutionTime.getTime();
                    }
                }
        );
    }
}


 类似资料:
  • 问题内容: 目前我有这个: 我可以更改它以使用对属性的引用 但是,我需要使用通过编程获得的值,以便可以在不重新部署应用程序的情况下更改计划。什么是最好的方法?我意识到可能无法使用注释… 问题答案: 使用可以动态计算下一次执行时间。 这样的事情应该可以解决问题(从改编为):

  • 问题内容: 我可以通过Java代码本身以编程方式设置java.library.path吗? 以下无效。 问题答案: 不,你不能。此属性是只读值。您可以在JVM启动时通过以下方式更改它: 如果要从特定位置加载库,则可以使用System.load(libraryPath)代替库的完整路径。

  • 我想使用Quartz、Spring和Hibernate创建动态作业。用户与web服务交互以创建此类作业: NoaJobInstancesDAO是一个简单的DAO类,它利用了Hibernate的EntityManager: 问题是,当这个作业触发时,会抛出一个异常: 我不明白为什么!在Manager类中,我以这种方式安排作业 其中排定程序作为 Edit1:应用程序上下文的实例似乎正确。问题不可能在那

  • 问题内容: 如何通过PHP脚本设置cron作业。 问题答案: 这将添加一个每天上午9:30运行的脚本。 如果从Web服务器运行此脚本,可能会遇到权限问题。为了解决这个问题,我建议使用另一种方法。 这是一种可能的解决方案。创建需要运行的脚本列表。您可以将其保存在文本文件或数据库中。创建一个脚本来读取此列表,并每分钟或每5分钟(使用cronjob)运行它。您的脚本将需要足够聪明,以决定何时运行脚本列表

  • 是否可以在Spring批处理中动态配置作业? 这是我想做的。我创建了几个不同的,如下所示: FlatFileItemReader 我希望能够在创建批处理作业时动态混合和匹配它们。例如,假设我需要一个有2个步骤的作业。第一步包含一个用于预处理的。第二步将有一个,用于使用我的阅读器/写入器进行基于块的数据处理......类似这样的东西: 在XML中,我可以执行以下操作: 但是我如何像上面一样以编程方式

  • 我正在使用spring批处理和spring批处理管理我们的日常批处理工作。我使用Tomcat7通过spring批处理管理UI启动作业对其进行了测试。 我的工作有跨不同服务器的远程分区步骤,我使用rabbitmq作为中间件,spring批量集成用于远程分区。 在测试过程中,我在所有服务器上部署应用程序,在所有服务器上启动tomcat,以启动所有监听器(入站网关并发线程),启动所有bean。 现在我想