写了一个自动去moofeel网站签到领金币魔币的程序,想要每天早上九点自动运行,于是考虑在Spring中用quartz实现
用maven创建 web工程,可参考在ECLIPSE中使用maven插件创建webapp类型项目
引入spring 和 quartz包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<!-- 2.1.6 not good in spring -->
<version>${quartz.version}</version>
</dependency>
其中spring版本3.x,quartz版本1.x,用2. x的时候,不太兼容,报错:“no setter found for property 'cronExpression' in class ......”,所以还是
<spring.version>3.1.3.RELEASE</spring.version>
<quartz.version>1.8.6</quartz.version>
在web.xml中配置spring监听
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<!-- 默认找/WEB-INF/applicationContext.xml, 如果配置contextConfigLocation则从contextConfigLocation来找配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
applicationContext.xml为spring的配置文件
在其中配置一个jobDetail,使用JobDetailBean,该类在context-support包里,引入spring-webmvc的时候已经包含了它
<bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="applicationContextJobDataKey" value="applicationContext"/>
<property name="jobClass" value="job.MoofeelSignJob"/>
<property name="jobDataAsMap">
<map>
<entry key="size" value="10"></entry>
</map>
</property>
</bean>
jobDetail的jobClass是自己定义的任务类,实现StatefulJob,是有状态的,也可以实现无状态的用于并发,
内容如下:
public class MoofeelSignJob implements StatefulJob{
@Override
public void execute(JobExecutionContext jctx) throws JobExecutionException {
// TODO Auto-generated method stub
Map dataMap = jctx.getJobDetail().getJobDataMap();
ApplicationContext ctx = (ApplicationContext) dataMap.get("applicationContext");
MoofeelSign moofeel = (MoofeelSign) ctx.getBean("moofeelSign");
try {
moofeel.sign();
// moofeel.test();
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置一个cronTrigger,里面配置每天8点58分触发,格式是秒、分、时、日、月、周。。。
属性jobDetail为刚才配置的jobDetail
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 8:48:45 moofeel sign everyday-->
<property name="cronExpression" value="45 58 8 * * ?" />
</bean>
最后配置SchedulerFactoryBean,加入所有的triggers
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
OK了,启动即可,run on server,每天都会运行。