在weblogic服务器启动期间启动计划作业会在spring应用程序中提供NullpointerException

时间:2014-12-15 08:10:10

标签: spring spring-mvc spring-boot spring-4

我的要求是使用spring scheduler(ThreadpoolScheduler)在weblogic服务器启动期间启动作业。这就是我所做的。

在app-context.xml中创建调度程序 -

task:scheduler id="scheduler" pool-size="10"

在类@PostConstruct

期间从应用程序context.xml获取调度程序的类中创建了一个方法
@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]

1 个答案:

答案 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;
    }
}

但是对我而言,您似乎正在尝试重新创建quartzdatabase driven jobs已提供的设施。所以你可能也想看看它。