2013-06-04 52 views
2

上午在春季休眠项目上工作 我正试图连接到数据库并从quartzjob获取值。但我得到一个空指针异常。我了when试图使用的ApplicationContext对象,并把它连接到了database.why豆我不能做其他方式空指针异常石英与弹簧集成

public class JobScheduler extends QuartzJobBean { 
    @Autowired 
    private SourceDaoImpl sourceDao; 
    @Override 
    protected void executeInternal(JobExecutionContext arg0) 
      throws JobExecutionException { 
     Client client = new Client(); 
     client.setClientKey(300); 

     sourceDao.getSourceByClient(client); **//error** 
    } 
    public SourceDaoImpl getSourceDao() { 
     return sourceDao; 
    } 
    public void setSourceDao(SourceDaoImpl sourceDao) { 
     this.sourceDao = sourceDao; 
    } 
} 

这是我的applicationContext.xml

<!-- scheduler --> 
<bean id="jobScheduler" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.dca.scheduling.JobScheduler" /> 
    <property name="jobDataAsMap"> 
     <map> 
      <entry key="timeout" value="5" /> 
     </map> 
    </property> 
</bean> 
<bean id="cronTriggerjobScheduler" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="jobScheduler" /> 
    <property name="cronExpression" value="0/10 * * * * ?" /> 
</bean> 
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="jobDetails"> 
     <list> 
      <ref bean="jobScheduler" /> 
     </list> 
    </property> 
    <property name="triggers"> 
     <list> 
      <ref bean="cronTriggerjobScheduler" /> 
     </list> 
    </property> 
</bean> 

<bean id="jobClass" 
    class="com.dca.scheduling.JobScheduler"> 

</bean> 

这是异常

ERROR 04-06 07:22:55,009 - Job DEFAULT.jobScheduler threw an unhandled Exception: 
java.lang.NullPointerException 
    at com.dca.scheduling.JobScheduler.executeInternal(JobScheduler.java:21) 
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 
ERROR 04-06 07:22:55,010 - Job (DEFAULT.jobScheduler threw an exception. 
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NullPointerException] 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:227) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 
Caused by: java.lang.NullPointerException 
    at com.dca.scheduling.JobScheduler.executeInternal(JobScheduler.java:21) 
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
    ... 1 more 

hibernate.xml

<bean id="sourceInstanceDao" class="com.dca.dao.impl.SourceInstanceDaoImpl"> 
     <property name="sessionFactory"> 
      <ref bean="sessionFactory" /> 
     </property> 
    </bean> 
+0

我看不到配置来连接dao类。 –

+0

它在那里我没有显示它在一个hibernatecontex.xml中,并且包含该文件到ApplicationContext.xml中 – jos

+1

请张贴该文件 –

回答

2

石英运行在自己的范围内,即使开始由Spring便捷的方法,所以你其实并不最终得到你的整个Spring应用程序上下文,除非你明确地在JobDataMap的豆类传递

<bean id="jobScheduler" class="org.springframework.scheduling.quartz.JobDetailBean"> 
     <property name="jobClass" value="com.vxl.appanalytix.dca.scheduling.JobScheduler" /> 
     <property name="jobDataAsMap"> 
      <map> 
       <entry key ="sourceDao" value-ref="sourceDao"/> 
       <entry key="timeout" value="5" /> 
      </map> 
     </property> 
    </bean> 

我的工作调度程序类

protected void executeInternal(JobExecutionContext jobContext) 
      throws JobExecutionException { 
     Client client = new Client(); 
     client.setClientKey(300); 
     sourceDao= (SourceDaoImpl) jobContext.getJobDetail() 
       .getJobDataMap().get("sourceDao"); 
} 
1

答案很不幸地很简单:sourceDao为空。

Quartz自己实例化作业类。将参数传递给该类的唯一方法是使用executeInternal()中的JobExecutionContext

首先,当你scheduleJob()你必须设置JobDetails。作为这里的dataManager

this.dataManager = (DataManager) jobContext.getJobDetail() 
           .getJobDataMap().get(DATA_MANAGER_MAP_KEY); 

在你的情况下使用sourceDao

JobDetail thisJobDetail = new SimpleJobDetail<T>(this.getClass().getName(), (Class<? extends AbstractQuartzJob<T>>) this.getClass()); 
thisJobDetail.getJobDataMap().put(DATA_MANAGER_MAP_KEY, 
       dataManager); 

sched.scheduleJob(thisJobDetail ,aTrigger); 

然后,当您正在执行的任务,您可以访问的细节是这样的。

+0

可以ü请帮助我用一段代码 – jos

+0

[检查此](http://stackoverflow.com/questions/10801048/quartz-with-spring-not-commiting?rq = 1)我认为这是问题是否有解决方案 – jos