以Java Application的形式在本地开发环境运行定时程序:
PropertyConfigurator.configure(ScheduleQuartz.class.getClassLoader().getResource("config/log4j.properties"));
ContextManager.setContext(new ClassPathXmlApplicationContext("/config/applicationContext.xml"));
将以上代码置于main方法里即可,假设为com.liaofeng.ScheduleQuartz类的main方法。
上面只是启动应用程序,但定时程序做为Bean配置在Spring的配置文件applicationContext.xml里面:
<bean id="placeOrderJobBean" class="com.liaofeng.quartz.PlaceOrder">
<property name="placeOrderFace" ref="placeOrderFace"/>
</bean>
<bean id="qplaceOrderJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="placeOrderJobBean"/>
<property name="targetMethod" value="run"/>
<property name="concurrent" value="false"/>
</bean>
<bean id="placeOrderTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="qplaceOrderJob"/>
</property>
<property name="cronExpression">
<value>0 0/5 01-23 * * ?</value>
</property>
</bean>
这样,类com.liaofeng.quartz.PlaceOrder里的run()方法将从1点开始,每5分钟运行一次。
在Linux/Unix下部署此定时程序,假设目录结构如下:
placeOrder
|--config
|--lib
|--run.sh
config目录用于放置配置文件,比如log4j.properties和applicationContext.xml,lib下面则放置依赖的Jar包。一般,我们将上面的应用程序打包,放置在lib目录下。run.sh文件则用于启动定时程序。一般情况下我们使用java命令直接启动定时程序,但在程序依赖很多jar包的情况下,指定java命令的classpath参数就显得相当麻烦,这是我们可以使用shell脚本来完成这个工作,代替我们启动Java程序:
jarpath=""
for _FNAME in /appDir/placeOrder/lib/*.jar
do
jarpath=$jarpath:$_FNAME
done
CLASSPATH=$CLASSPATH:$jarpath
export CLASSPATH
echo -n $CLASSPATH
export PATH=/opt/java1.5/bin:$PATH
java -Xms128m -Xmx256m -XX:+UseGetTimeOfDay -classpath $CLASSPATH com.liaofeng.ScheduleQuartz &
exit 0
注意java com.liaofeng.ScheduleQuartz &,这里以&结尾,防止程序运行完一次后就退出,有了&就是一直运行。但因为这个&的存在,第一次启动的时候即使报错,在命令行里也可能不打印启动时的错误信息,所以建议第一次运行时不带该&,等程序调试通过了再加上&。