我的要求是使用spring scheduler(ThreadpoolScheduler
)在weblogic服务器启动期间启动作业。这就是我所做的。
在app-context.xml中创建调度程序 -
task:scheduler id="scheduler" pool-size="10"
在类@PostConstruct
@DependsOn("scheduler")
@PostConstruct
public void bootstrapJobs(){
ScheduleTask1 task = (ScheduleTask1) instanceOf(Class.forName(jobInfo.getTaskClass()));
task.setInstance(jobInfo.getJobName());
CronTrigger trigger=new CronTrigger(jobInfo.getJobFrequency());
ThreadPoolTaskScheduler scheduler = (ThreadPoolTaskScheduler)
ApplicationContextProvider.getApplicationContext().getBean("scheduler");
scheduler.schedule(task, trigger);
}
这是在我的本地weblogic服务器上安排工作完全正常,但在生产时它给了我
以下行的异常...(ThreadPoolTaskScheduler
)
ApplicationContextProvider.getApplicationContext().getBean("scheduler");
scheduler.schedule(task, trigger).
有关如何解决此问题的任何想法?
java.lang.NullPointerException
at SchedulerService.createJob(SchedulerService.java:67) [_wl_cls_gen.jar:?]
at SchedulerService.createBootstrapJob(SchedulerService.java:121) [_wl_cls_gen.jar:?]
at SchedulerService.bootstrapJobs(SchedulerService.java:91) [_wl_cls_gen.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_15]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_15]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_15]
at java.lang.reflect.Method.invoke(Method.java:601) ~[?:1.7.0_15]
答案 0 :(得分:1)
当您使用的是Spring 4.1时,您可以创建一个实现SmartInitializingSingleton
接口的bean。在构造完所有单例之后,将调用此接口上的方法。
public class SchedulerService implements SmartInitializingSingleton {
@Autowired
private TaskScheduler scheduler;
public void afterSingletonsInstantiated() {
ScheduleTask1 task = (ScheduleTask1) instanceOf(Class.forName(jobInfo.getTaskClass()));
task.setInstance(jobInfo.getJobName());
CronTrigger trigger=new CronTrigger(jobInfo.getJobFrequency());
scheduler.schedule(task, trigger);
}
}
Oryou可以实现ApplicationListener
接口并监听ContextRefreshedEvent
。在完全初始化应用程序上下文之后将调用后者。
这两种方法的好处是你可以简单地注入TaskScheduler
而不是自己进行查找。
现在您也在构建ScheduleTask1
自己的实例,您可能希望将其设为prototype
范围的bean,并使用getBean
上的BeanFactory
进行查找。这样,如果需要,可以注入任务依赖项。
public class SchedulerService implements SmartInitializingSingleton, BeanFactoryAware {
@Autowired
private TaskScheduler scheduler;
private BeanFactory bf;
public void afterSingletonsInstantiated() {
ScheduleTask1 task = bf.getBean(jobInfo.getTaskClass);
task.setInstance(jobInfo.getJobName());
CronTrigger trigger=new CronTrigger(jobInfo.getJobFrequency());
scheduler.schedule(task, trigger);
}
public void setBeanFactory(BeanFactory bf) {
this.bf=bf;
}
}
但是对我而言,您似乎正在尝试重新创建quartz和database driven jobs已提供的设施。所以你可能也想看看它。