Pau*_*nel 13 java jobs spring scheduled-tasks java-8
我一直在研究如何使用Java 8和spring在运行时更改作业的频率.这个问题非常有用,但并没有完全解决我的问题.
我现在可以配置下次执行作业的日期.但是如果将延迟设置为1年,那么我需要在考虑新配置之前等待1年.
我的想法是在配置值发生变化时停止计划任务(所以从另一个类开始).然后在下次执行任务时重新计算.也许有一种更简单的方法可以做到这一点.
这是我到目前为止的代码.
@Configuration
@EnableScheduling
public class RequestSchedulerConfig implements SchedulingConfigurer {
@Autowired
SchedulerConfigService schedulerConfigService;
@Bean
public RequestScheduler myBean() {
return new RequestScheduler();
}
@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().startReplenishmentComputation();
}
},
new Trigger() {
@Override public Date nextExecutionTime(TriggerContext triggerContext) {
Duration d = schedulerConfigService.getIntervalFromDB();
return DateTime.now().plus(d).toDate();
}
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想做的事情.
@RestController
@RequestMapping("/api/config/scheduler")
public class RequestSchedulerController {
@Autowired
ApplicationConfigWrapper applicationConfigWrapper;
@RequestMapping("/set/")
@ResponseBody
public String setRequestSchedulerConfig(@RequestParam(value = "frequency", defaultValue = "") final String frequencyInSeconds){
changeValueInDb(frequencyInSeconds);
myJob.restart();
return "Yeah";
}
}
Run Code Online (Sandbox Code Playgroud)
TaskScheduler.这将持有的状态变量的所有ScheduledFutures ^,如private ScheduledFuture job1;job1.Future(例如job1),然后用新的调度数据再次启动它.这里的关键思想是在Future创建s时控制它们,以便将它们保存在某些状态变量中,这样当调度数据中的某些内容发生变化时,您可以取消它们.
这是工作代码:
applicationContext.xml中
<task:annotation-driven />
<task:scheduler id="infScheduler" pool-size="10"/>
Run Code Online (Sandbox Code Playgroud)
单身豆,持有Futures
@Component
public class SchedulerServiceImpl implements SchedulerService {
private static final Logger logger = LoggerFactory.getLogger(SchedulerServiceImpl.class);
@Autowired
@Qualifier(value="infScheduler")
private TaskScheduler taskScheduler;
@Autowired
private MyService myService;
private ScheduledFuture job1;//for other jobs you can add new private state variables
//Call this on deployment from the ScheduleDataRepository and everytime when schedule data changes.
@Override
public synchronized void scheduleJob(int jobNr, long newRate) {//you are free to change/add new scheduling data, but suppose for now you only want to change the rate
if (jobNr == 1) {//instead of if/else you could use a map with all job data
if (job1 != null) {//job was already scheduled, we have to cancel it
job1.cancel(true);
}
//reschedule the same method with a new rate
job1 = taskScheduler.scheduleAtFixedRate(new ScheduledMethodRunnable(myService, "methodInMyServiceToReschedule"), newRate);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9479 次 |
| 最近记录: |