SpringMVC中quartz的使用问题

蓝色的样子 2011-10-24 03:09:22
我要用spring的quartz去实现任务调度,每隔一分钟调用一次后台方法。具体代码如下:
quartz配置文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 要调用的工作类 -->
<bean id="leaveQuartz" class="util.LeaveQuartz"></bean>

<!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="leaveQuartz" />
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>quartzStart</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobtask" />
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0 0/1 9-19 * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime" />
</list>
</property>
</bean>

</beans>


要调用的类:
LeaveQuartz.java

@Controller
public class LeaveQuartz
{
private EmployeeLeaveService employeeLeaveService;

@Resource(name = "employeeLeaveService")
public void setEmployeeLeaveService(EmployeeLeaveService employeeLeaveService)
{
this.employeeLeaveService = employeeLeaveService;
}

public void quartzStart()
{
updateLeaveingsNumber();
}

public void updateLeaveingsNumber()
{
double leaveingsNumber = HRConstants.MATH_ZORE;
employeeLeaveService.getEmployeeLeaveMaxId();
}
}


我把applicationContext.xml配置在web.xml中,让任务调度随tomcat启动时调用,单不知道为什么LeaveQuartz.java类中employeeLeaveService总是为null。
忘高手能解答.....
谢谢了。
...全文
373 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kouyiSC 2011-10-26
  • 打赏
  • 举报
回复
基本的代码都发给你了。。。任务调度的代码就这些了。。
然后就是service的获取了。。。
由于任务调度时没有通过struts2获取上下文的applicationContext,所以手动配置一个applicationContext对象。在程序启动的时候,初始化一个applicationContext就行了。。。。
kouyiSC 2011-10-26
  • 打赏
  • 举报
回复
我的代码就是调用的service层得代码呀
<bean id="job" class="com.wb.sms.service.imp.SmsSendServiceImp">

service实现类:
public class SmsSendServiceImp implements ISmsSendService {

汗!!!!!!!!!!!!!!!!
无敌狗狗哇哦 2011-10-26
  • 打赏
  • 举报
回复
不好意思啊 我感觉应该是调用的是service 就是 manager的那个 层的代码 而不是 这个 control的代码 不知道我说的对不对啊 给你顶一个吧
蓝色的样子 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kouyisc 的回复:]

web.xml也给你
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<pa……
[/Quote]

能不能把你的代码发给我,我还是没弄出来。
kouyiSC 2011-10-24
  • 打赏
  • 举报
回复
web.xml也给你
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext*.xml,classpath*:applicationContext*.xml
</param-value>
</context-param>
kouyiSC 2011-10-24
  • 打赏
  • 举报
回复
<!-- 要调用的工作类 -->
<bean id="leaveQuartz" class="util.LeaveQuartz"></bean>
这个配置怎么没有注入service?你那里写的是注解的方式?注解我不懂。。。
public class LeaveQuartz
{}你的这个LeaveQuartz是一个类啊。。。应该是需要往接口实现中注入吧?

由于注解方式我没搞过。。所以还是将我的调度程序贴给你自己去参考一下把:

配置如下:
<bean id="job" class="com.wb.sms.service.imp.SmsSendServiceImp">
<property name="dao">
<ref bean="smsSendDAO" />
</property>
</bean>

<bean id="clearLogJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="job" />
</property>
<property name="targetMethod">
<value>JobSmsSend_Remove</value>
</property>
</bean>
<bean id="clearLog" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="clearLogJob" />
</property>
<property name="cronExpression">
<value> 0 0 0 * * ? </value>
</property>
</bean>
<bean id="sfb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="clearLog" />
</list>
</property>
</bean>

service实现类:
public class SmsSendServiceImp implements ISmsSendService {

private ISmsSendDAO dao;

public ISmsSendDAO getDao() {
return dao;
}

public void setDao(ISmsSendDAO dao) {
this.dao = dao;
}
/**
* 转移发件箱超过15天的消息至临时表
* @return
*/
public void JobSmsSend_Remove(){
// TODO Auto-generated method stub
try {
dao.JobSmsSend_Remove();
} catch (Exception ce) {
ce.printStackTrace();
}
}
}

dao里面的东西就不用贴了吧。。都一样。。。上面这个调度程序能够正常运行使用。。。。希望对你有帮助
蓝色的样子 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nizhicheng 的回复:]

<property name="cronExpression">
<value>0 0/1 9-19 * * ?</value>
</property>
也是这里设置的 具体我也忘了用太久了
可以指定什么时候执行 每个多久执行 也可以计划执行~~当初用起来还是蛮方便的
[/Quote]

我刚才在网上搜了一下,我估计是tomcat的web.xml的加载顺序是listener ->filter->servlet。所以我估计是先listener的,但此时spring容器还没有对employeeLeaveService 初始化。
nizhicheng 2011-10-24
  • 打赏
  • 举报
回复
<property name="cronExpression">
<value>0 0/1 9-19 * * ?</value>
</property>
也是这里设置的 具体我也忘了用太久了
可以指定什么时候执行 每个多久执行 也可以计划执行~~当初用起来还是蛮方便的
蓝色的样子 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nizhicheng 的回复:]

对于employeeLeaveService 怎么注入进来的 写了批注?没搞懂~~
猜测 如果程序没有问题的话~~~quartz延迟启动下 等TOMCAT 把所有的SERVELT文件加载完了你再调用
[/Quote]


能说说具体怎么弄么。我该怎么控制让任务调度延迟加载。
nizhicheng 2011-10-24
  • 打赏
  • 举报
回复
对于employeeLeaveService 怎么注入进来的 写了批注?没搞懂~~
猜测 如果程序没有问题的话~~~quartz延迟启动下 等TOMCAT 把所有的SERVELT文件加载完了你再调用
UF_dao 2011-10-24
  • 打赏
  • 举报
回复
还是去找聊城牛人师朋吧,能写1G的神人,应该可以解决这么犀利的问题!~
chenjian98 2011-10-24
  • 打赏
  • 举报
回复
问题相当之犀利,有待牛人出现。
finally2011 2011-10-24
  • 打赏
  • 举报
回复
就是不告诉你。。。。
chenjian98 2011-10-24
  • 打赏
  • 举报
回复
顶!!!
UF_dao 2011-10-24
  • 打赏
  • 举报
回复
请老吴~

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧