事情是这样的,动态启动多个任务去发送消息,这个任务我是从数据库里获取,各个任务的启动是同一个JOB,只是每个任务JOB传入的参数不同,但这个JOB,需要一个spring 的dao,得不到spring注入的dao属性,不知道怎么回事 1.spring配置dao –application*.xml– ….msgDao已经配好数据源 spring } public class SendMsg implements Job ……略 …..do sth. 现在主要出现两个问题: 1.实现的job没法得到spring已经注入的dao,出现空指针,先前第一次初始化任务可以得到dao,但是动态生成任务,实现job,无法得到spring注入的属性dao,这是什么原因,请各位XDJM看有什么办法,困扰好久了…万分感谢… |
|
没人回答,XDJM们,用的技术就是spring2.5.5+quartz-1.6.5
|
|
10分 |
你读取spring配置文件啦吗?ApplicationContext……
|
10分 |
<property name=”schedulerContextAsMap”>
<map> <!– spring 管理的service需要放到这里,才能够注入成功 –> <description>schedulerContextAsMap</description> <entry key=”xxService或xxRepo” value-ref=”xxService或xxRepo” /> </map> </property> |
40分 |
<!-- 定时执行任务的类,要继承TimerTask --> <!-- <bean id ="SmsSendTask" class ="com.aisino.platform.sms.core.SmsSendTask" /> --> <!-- 用Spring管理这个TimerTask,设定触发间隔 --> <!-- <bean id ="ScheduledUserTimerTask" class ="org.springframework.scheduling.timer.ScheduledTimerTask" > <property name ="delay" > <value > 10000 </value > </property > <property name ="period" > <value > 60000 </value > </property > <property name ="timerTask" > <ref local ="SmsSendTask" /> </property > </bean > --> <!-- <bean id ="SmsQuickQueueSendTask" class ="com.aisino.platform.sms.queue.SmsQuickQueueSendTask" /> <bean id ="ScheduledQuickTimerTask" class ="org.springframework.scheduling.timer.ScheduledTimerTask" > <property name ="delay" > <value >30000</value> </property > <property name ="period" > <value >60000</value > </property > <property name ="timerTask" > <ref local ="SmsQuickQueueSendTask" /> </property > </bean > <bean id ="timerFactory" class ="org.springframework.scheduling.timer.TimerFactoryBean" > <property name ="scheduledTimerTasks" > <list > <ref local ="ScheduledQuickTimerTask" /> </list > </property > </bean > 参考下 |
20分 |
<bean id="sendMsgJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>com.youcom.job.SendMsg</value> </property> <property name="jobDataAsMap"> <map> <entry key="msgDao"><ref bean="msgDao"/></entry> </map> </property> </bean> 将SendMsg改为继承SPIRNG的QuartzJobBean 在TestInit中注入上面定义的JobDetail,加入如下内容: |
10分 |
楼主所指的动态生成任务没有得到msgDao,但这个动态生成的任务是如何创建SendMsg 实例的呢?反射吗?反射的话就得不到msgDao了。只有取spring容器中的SendMsg 实例才能取到msgDao,通过反射创建的SendMsg实例,spring并没有将msgDao注入其中。
第2个问题没看懂,不知道是不是由于第1个问题引起的。 |
第二个问题,错误提示如下:org.quartz.ObjectAlreadyExistsException:Unable to store Job withe name:””smsJob_222″” and group:””DEFAULT””,because one already exists with this identification
|
|
是通过反射创建的:
JobDetail jobDetail=new JobDetail(“msgJob_”+msgGetId(),Scheduler.DEFAULT_GROUP,SendMsgJob.class);//可以看这是一个CLASS类,SendMsgJob.class |
|
10分 |
JobDetail jobdetail=new JobDetail(“msgJob_”+msg.getId(),Scheduler.DEFAULT_GROUP,SendMsg.class); 循环的时候,msg.getId有重复的吧? |
通过反射创建的SendMsg实例,spring并没有将msgDao注入其中。如果必须要用的dao的话,还是通过ApplicationContext获取吧。
|
|
同样的困扰,是否已解决?
|
|
问题已解决。 我的处理办法是: public static Object getBean(String beanName){ 然后在spring配置文件中加入这个util的<bean class …即可 |
|
同样的困扰,是否已解决?
|