写这篇文章的目的是:只要我需要使用定时器的时候可以 傻瓜式的 使用。本人喜欢使用xml的配置,所以没有使用注解的方式。
1:要quartz 需要的jar包。特别说明:因为我们在引入spring包的一般都是只导入我们需要的jar包,所以很多时候我们缺少spring-context-support.jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
commons-collections-3.2.jar 这个jar包一般都回有,检查下就好。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
commons-collections-3.2.jar 这个jar包一般都回有,检查下就好。
2:在web中进行配置,确保我们的 定时器配置会被加载。 (注意红色部分有个绿色的星号,这个就是要加载 只要是
/spring-config开头的xml文件)
<listener>
<description>Spring 核心配置</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:conf/spring/spring-config*.xml
</param-value>
</context-param>
3.定时器的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=" http://www.springframework.org/schema/beans"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xmlns:p=" http://www.springframework.org/schema/p"
xmlns:context=" http://www.springframework.org/schema/context"
xmlns:aop=" http://www.springframework.org/schema/aop"
xmlns:tx=" http://www.springframework.org/schema/tx"
xmlns:util=" http://www.springframework.org/schema/util"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd"
default-autowire="byName">
<!-- 5分钟扫描一次 -->
<!-- 创建索引的业务类 用红色表示出来是因为这个 定时器的 类, 带颜色的也就是自己需要许改的地方 -->
<bean name = " sendOrderNum" class=" com.message.service.impl.ShopOrderMessageService"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean name=" sendTelMessage" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean=" sendOrderNum"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value> sendTelMessage</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean name= "myTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean=" sendTelMessage"/>
</property>
<!-- cron表达式 一个定时器可以有多个时间规则,这里我没用到 需要的话自己查看下 时间规则网上找起来很多-->
<property name="cronExpression">
<value>0 0/5 0-23 * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 mytask name注意不要和其他的bean重名-->
<bean name=" mytask" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean=" myTime"/>
</list>
</property>
</bean>
</beans>
4.java 的实现类 当然根据自己的情况自己编写功能了, 顺便看下@Resource 和 @Autowired的区别
@Resource 这个是通过 name属性进行查找的。使用情况:如果一个接口有多个实现类,这个时候我们就需要用到这个
@Autowired 这个是通过类型进行查找的。使用情况:只有一个类实现了接口。因为spring在启动的时候对所有的对象都进行了加载,所以找实现类还是很快的。 (个人实践认为:如果只有一个实现类的话,用这两个是没有区别的!)
package com.message.service.impl;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.common.utils.XmemcachedUtil;
import com.message.domain.ShopOrderMessage;
import com.message.service.IBuyTelphoneVerifyService;
import com.message.service.IMsgShopBuysService;
import com.message.service.IShopOrderMessageService;
import com.message.service.IShopOrdersService;
public class ShopOrderMessageService{
@Resource
private IShopOrderMessageService shopOrderMessageServiceImpl;
@Autowired
private IBuyTelphoneVerifyService buyTelphoneVerifyService;
@Autowired
private IShopOrdersService shopOrdersService;
@Autowired
private XmemcachedUtil xmemcachedUtil;
@Autowired
private IMsgShopBuysService shopBuysService;
Logger logger = Logger.getLogger(this.getClass());
public void sendTelMessage(){
try {
Map<String,Object> map = new HashMap<String,Object>();
map.put("yesOrNo", "0");
//查询出需要发送消息的集合
List<ShopOrderMessage> list = shopOrderMessageServiceImpl.selectByParams(map);
//测试结束后需要改的地方 : 数据配置
//<![CDATA[AND UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(LAST_SEND_MSG_TIME) >= SHOP_SPACE_TIME * 5 * 60 ]]>
for(int i = 0;i < list.size();i++){
ShopOrderMessage s = list.get(i);
String shopId = s.getShopId();
int spaceTime = Integer.parseInt(s.getShopSpaceTime()) * 60;
int orderNum = shopOrdersService.selectOrderNum
(shopId,spaceTime,s.getLastSendMsgTime());
String context = "";
int buysNum = shopBuysService.selectBuysNum(shopId, spaceTime,s.getLastSendMsgTime());
if(orderNum != 0 && buysNum == 0){
context = "提醒:您有"+orderNum+"个新订单!";
}else if(orderNum == 0 && buysNum != 0){
context = "提醒:您有"+buysNum+"个新的零售商申请!";
}else if(orderNum != 0 && buysNum != 0){
context = "提醒:您有"+orderNum+"个新订单和"+buysNum+"个新的零售商申请!";
}
if(context.length() > 1){
buyTelphoneVerifyService.smsInfo(null,context,s.getTel());
}
s.setLastSendMsgTime(new Date());
shopOrderMessageServiceImpl.update(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
<listener>
<description>Spring 核心配置</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:conf/spring/spring-config*.xml
</param-value>
</context-param>
3.定时器的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=" http://www.springframework.org/schema/beans"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xmlns:p=" http://www.springframework.org/schema/p"
xmlns:context=" http://www.springframework.org/schema/context"
xmlns:aop=" http://www.springframework.org/schema/aop"
xmlns:tx=" http://www.springframework.org/schema/tx"
xmlns:util=" http://www.springframework.org/schema/util"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd"
default-autowire="byName">
<!-- 5分钟扫描一次 -->
<!-- 创建索引的业务类 用红色表示出来是因为这个 定时器的 类, 带颜色的也就是自己需要许改的地方 -->
<bean name = " sendOrderNum" class=" com.message.service.impl.ShopOrderMessageService"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean name=" sendTelMessage" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean=" sendOrderNum"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value> sendTelMessage</value>
</property>
</bean>
<!-- 定义触发时间 -->
<bean name= "myTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean=" sendTelMessage"/>
</property>
<!-- cron表达式 一个定时器可以有多个时间规则,这里我没用到 需要的话自己查看下 时间规则网上找起来很多-->
<property name="cronExpression">
<value>0 0/5 0-23 * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 mytask name注意不要和其他的bean重名-->
<bean name=" mytask" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean=" myTime"/>
</list>
</property>
</bean>
</beans>
4.java 的实现类 当然根据自己的情况自己编写功能了, 顺便看下@Resource 和 @Autowired的区别
@Resource 这个是通过 name属性进行查找的。使用情况:如果一个接口有多个实现类,这个时候我们就需要用到这个
@Autowired 这个是通过类型进行查找的。使用情况:只有一个类实现了接口。因为spring在启动的时候对所有的对象都进行了加载,所以找实现类还是很快的。 (个人实践认为:如果只有一个实现类的话,用这两个是没有区别的!)
package com.message.service.impl;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.common.utils.XmemcachedUtil;
import com.message.domain.ShopOrderMessage;
import com.message.service.IBuyTelphoneVerifyService;
import com.message.service.IMsgShopBuysService;
import com.message.service.IShopOrderMessageService;
import com.message.service.IShopOrdersService;
public class ShopOrderMessageService{
@Resource
private IShopOrderMessageService shopOrderMessageServiceImpl;
@Autowired
private IBuyTelphoneVerifyService buyTelphoneVerifyService;
@Autowired
private IShopOrdersService shopOrdersService;
@Autowired
private XmemcachedUtil xmemcachedUtil;
@Autowired
private IMsgShopBuysService shopBuysService;
Logger logger = Logger.getLogger(this.getClass());
public void sendTelMessage(){
try {
Map<String,Object> map = new HashMap<String,Object>();
map.put("yesOrNo", "0");
//查询出需要发送消息的集合
List<ShopOrderMessage> list = shopOrderMessageServiceImpl.selectByParams(map);
//测试结束后需要改的地方 : 数据配置
//<![CDATA[AND UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(LAST_SEND_MSG_TIME) >= SHOP_SPACE_TIME * 5 * 60 ]]>
for(int i = 0;i < list.size();i++){
ShopOrderMessage s = list.get(i);
String shopId = s.getShopId();
int spaceTime = Integer.parseInt(s.getShopSpaceTime()) * 60;
int orderNum = shopOrdersService.selectOrderNum
(shopId,spaceTime,s.getLastSendMsgTime());
String context = "";
int buysNum = shopBuysService.selectBuysNum(shopId, spaceTime,s.getLastSendMsgTime());
if(orderNum != 0 && buysNum == 0){
context = "提醒:您有"+orderNum+"个新订单!";
}else if(orderNum == 0 && buysNum != 0){
context = "提醒:您有"+buysNum+"个新的零售商申请!";
}else if(orderNum != 0 && buysNum != 0){
context = "提醒:您有"+orderNum+"个新订单和"+buysNum+"个新的零售商申请!";
}
if(context.length() > 1){
buyTelphoneVerifyService.smsInfo(null,context,s.getTel());
}
s.setLastSendMsgTime(new Date());
shopOrderMessageServiceImpl.update(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}