1. 定时器注入的方法以及逻辑
package com.wytech.Timer;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionContext;
import com.wytech.context.Constant;
import com.wytech.dao.UserCreditDao;
import com.wytech.domain.AwardLog;
import com.wytech.domain.Message;
import com.wytech.domain.User;
import com.wytech.domain.UserCredit;
import com.wytech.service.AwardService;
import com.wytech.service.MessageService;
import com.wytech.service.UserCreditService;
import com.wytech.service.UserService;
import com.wytech.service.impl.AwardServiceImpl;
public class Timer {
private Logger logger=Logger.getLogger(Timer.class);
private AwardService awardService;
private UserCreditService userCreditService;
private UserCreditDao userCreditDao;
private UserService userService;
private MessageService messageService;
public MessageService getMessageService() {
return messageService;
}
public void setMessageService(MessageService messageService) {
this.messageService = messageService;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public AwardService getAwardService() {
return awardService;
}
public void setAwardService(AwardService awardService) {
this.awardService = awardService;
}
public UserCreditService getUserCreditService() {
return userCreditService;
}
public void setUserCreditService(UserCreditService userCreditService) {
this.userCreditService = userCreditService;
}
public UserCreditDao getUserCreditDao() {
return userCreditDao;
}
public void setUserCreditDao(UserCreditDao userCreditDao) {
this.userCreditDao = userCreditDao;
}
/**
* 我的钱票到期提醒提前三天
* 每天早上6点执行
* 在applictionTimer.xml中配置时间
*/
public void doMyUserQianPiao(){
logger.debug("定时器计算我的钱票信息每天早上6点执行");
//返回所有的用户中奖的钱票信息
List<AwardLog> list = awardService.awardLog_qianpiao();
//创建记录钱票过去的用户信息
List<AwardLog> listCount = new ArrayList<AwardLog>();
boolean flag = true;
for (int i = 0; i < list.size(); i++) {
//得到添加的时间
long addtime = list.get(i).getAddtime();
//把日期加半年减去3天
String tixingTime = showDate(addtime+"",6,-3);
//得到现在的日期
String nowTime = GetNowDate();
//提醒时间和今天的日期比对一样就提醒改用户钱票快到期了
if (tixingTime == nowTime || tixingTime.equals(nowTime)) {
//说明今天查到了即将过期的钱票信息
//判断记录钱票过期的用户信息是否有信息
if (listCount.size() == 0) {
//为0说明还有信息创建一个
AwardLog al = new AwardLog();
al.setUser_id(list.get(i).getUser_id());
//设置有一张钱票即将过期
al.setContent(1);
listCount.add(al);
} else {
// 判断如果记录钱票过期的用户信息的集合不为空说明有记录了已经
if (listCount.size() != 0) {
// 有记录 查询是否有当前用户的信息
for (int j = 0; j < listCount.size(); j++) {
// 说明当前用户在钱票过期集合里面有了 那么就 count +1
if (list.get(i).getUser_id() == listCount.get(j).getUser_id()) {
listCount.get(j).setContent(listCount.get(j).getContent() + 1);
//如果找到了记录为false;
flag = false;
}
}
if (flag) {
// 记录集合中没有就新加一条
AwardLog al = new AwardLog();
al.setUser_id(list.get(i).getUser_id());
// 设置有一张钱票即将过期
al.setContent(1);
listCount.add(al);
}
}
}
}
}
//在for最外层的外面 遍历记录即将到期的钱票信息
for (int i = 0; i < listCount.size(); i++) {
//定义并创建发送站内信息的对象
Message message = new Message();
message.setSend_userid(1);//标识是系统admin发的站内信
message.setReceive_user(listCount.get(i).getUser_id());
User user = userService.getUserById(listCount.get(i).getUser_id());
message.setStatus(0);
message.setType("");
message.setAddip("");
long time = new Date().getTime()/1000;
String addtimg = String.valueOf(time);
message.setAddtime(addtimg);
message.setName("[钱钱贷]钱票到期提醒");
message.setContent("尊敬的<a href='http://www.qqjrd.com' title='钱钱贷' target='_blank'>[钱钱贷]</a>用户["+user.getUsername()+"],您有[<span style='color:red;fount-size:14px;'>"+listCount.get(i).getContent()+"</span>张钱票]在[<span style='color:red;fount-size:14px;'>三天后</span>]将要过期,请尽快使用。");
sendInstaTion(message);
}
}
/**
* 发送站内信的方法
*/
public void sendInstaTion(Message message){
message.setSent_user(message.getSend_userid());
message.setReceive_user(message.getReceive_user());
message.setStatus(0);
message.setType(message.getType());
message.setAddip(message.getAddip());
message.setAddtime(message.getAddtime());
message.setName(message.getName());
message.setContent(message.getContent());
messageService.addMessage(message);
}
/**
* 修改时间的方法
*/
public static String showDate(String beginDate,int month,int day){
//得到当前用户的到期时间的时间戳 new Date().getTime()/1000
//long beginDate = new Date().getTime()/1000;
//乘以1000转换时间
String end_time = beginDate+"000";
String vip_end_time = end_time;
//设置时间转化格式
SimpleDateFormat sdfss=new SimpleDateFormat("yyyy-MM-dd");
String sd = sdfss.format(new Date(Long.parseLong(vip_end_time)));
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date dd;
String da="";
try {
dd = format.parse(sd);
Calendar c = Calendar.getInstance();
c.setTime(dd);
//1标识的是年 后面增加的
//c.add(1, 6);
if (month != 0) {
c.add(2, month);
}
if (day != 0) {
c.add(c.DATE, day);
}
Date temp_date = c.getTime();
da = format.format(temp_date);
//System.out.println(da);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return da;
}
/**
* 时间戳转换时间
* @param timestampString
* @return
*/
public static String TimeStamp2Date(String timestampString){
Long timestamp = Long.parseLong(timestampString)*1000;
String date = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date(timestamp));
return date;
}
/**
* 获取当前的时间格式
* 格式例 2015-01-13
* @return
*/
public static String GetNowDate(){
String temp_str="";
Date dt = new Date();
//最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
temp_str=sdf.format(dt);
return temp_str;
}
/***
* 对于到期的钱票实行删除
* 每天晚上23点执行删除
* 在钱票添加的时间加半年后与今天的日期比对
* 如果等于今天的日期那么就说明到期了将到期的钱票删除
*/
public void deleteExpireQianPiao(){
logger.debug("定时器计算我的钱票信息每天23点执行");
//返回所有的用户中奖的钱票信息
List<AwardLog> list = awardService.awardLog_qianpiao();
for (int i = 0; i < list.size(); i++) {
//得到添加的时间
long addtime = list.get(i).getAddtime();
//把日期加半年
String tixingTime = showDate(addtime+"",6,0);
//得到现在的日期
String nowTime = GetNowDate();
//然后比对加了半年的日期和今天的日期是否一样 如果一样就删除了这张钱票
if (tixingTime == nowTime || tixingTime.equals(nowTime)) {
//说明有一样的做删除操作
awardService.deleteAwardLog(list.get(i).getId());
}
}
}
}
2. 关于定时器的xml文件配置
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<!--
<bean id="awardServiceImpl" class="com.wytech.service.impl.AwardServiceImpl">
</bean>
<bean id="userCreditService" class="com.wytech.service.impl.UserCreditServiceImpl">
</bean>
<bean id="userCreditDao" class="com.wytech.dao.jdbc.UserCreditDaoImpl">
</bean>
-->
<!-- 定义timer id可以随便去 class="com.wytech.Timer.Timer" 指向你的类 property 为注入的服务方法-->
<bean id="timer" class="com.wytech.Timer.Timer">
<property name="awardService">
<ref bean="awardService" />
</property>
<property name="userCreditService">
<ref bean="userCreditService" />
</property>
<property name="userCreditDao">
<ref bean="userCreditDao" />
</property>
<property name="userService">
<ref bean="userService" />
</property>
<property name="messageService">
<ref bean="messageService" />
</property>
</bean>
<!-- 配置钱票到期提醒 开始 -->
<!-- id随便去 class 为固定的 -->
<bean id="doMyUserQianPiao" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- name固定的 ref 引用的是上面的id timer -->
<property name="targetObject" ref="timer"/>
<!-- name是固定的 value引用的是timer类中的的要执行的方法 (在timer类中制定有这么个类要执行) -->
<property name="targetMethod" value="doMyUserQianPiao"/>
</bean>
<!-- id随便去的 class的引用为固定的 -->
<bean id="doMyUserQianPiaoTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- name为固定的 ref引用上面的id 标识要配置多长时间执行 -->
<property name="jobDetail" ref="doMyUserQianPiao" />
<!-- cron表达式 --><!-- 每天晚上11点执行秒执行一次 -->
<property name="cronExpression" value="0 0 6 * * ? " />
</bean>
<!-- 配置钱票到期提醒 结束 -->
<!-- 配置钱票到期删除 开始 -->
<!-- id随便去 class 为固定的 -->
<bean id="deleteExpireQianPiao" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- name固定的 ref 引用的是上面的id timer -->
<property name="targetObject" ref="timer"/>
<!-- name是固定的 value引用的是timer类中的的要执行的方法 (在timer类中制定有这么个类要执行) -->
<property name="targetMethod" value="deleteExpireQianPiao"/>
</bean>
<!-- id随便去的 class的引用为固定的 -->
<bean id="deleteExpireQianPiaoTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- name为固定的 ref引用上面的id 标识要配置多长时间执行 -->
<property name="jobDetail" ref="deleteExpireQianPiao" />
<!-- cron表达式 --><!-- 每天晚上11点执行秒执行一次 -->
<property name="cronExpression" value="0 0 23 * * ? " />
</bean>
<!-- 配置钱票到期删除 结束 -->
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startTimer" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 钱票到期提醒 -->
<ref bean="doMyUserQianPiaoTime"/>
<!-- 钱票到期删除 -->
<ref bean="deleteExpireQianPiaoTime"/>
</list>
</property>
</bean>
</beans>