最近做了基于webserviceSAOP的一些接口功能,主要是我们这边线上的数据和客户那边的服务器的数据进行对接和同步,完成会员的注册,绑定,积分,余额查询,优惠券的查询核销,积分,余额的变动提醒等。
因为这一篇的主题是关于定时器的,所以这里主要强调这块的内容,因为我们是在微信公众号上进行开发的,所以每当有积分变动或者余额变动的时候需要通过微信平台发送提示信息给用户,如下图
这里我们需要做的就是首先需要对积分记录表进行监视,每隔一段时间(我这里设置的是20秒)对表里的数据进行一次查询,如果有新插入的数据,将其获取出来,包括变动的积分值,积分表的id,创建时间,得到积分的原因(状态,比如注册给一个标识1,绑定2,签到3,消费获得积分4等),然后通过微信平台提供的api,将这条提醒发送给用户
下面就具体展示定时器这块的部分代码,首先是需要在服务一启动就需要执行的,所以我们需要先在web.xml中进行配置 如下:
这里定义了初始化执行的filter 具体的类则继承了filter
class InitFilter implements Filter 并重写了init函数,定义好了之后相当于每次在服务器启动的时候都会走咱们自己定义initfilter这个类里的init方法,在这里面我们可以定义自己的定时器任务 具体代码如下所示:
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
Properties pro = PropertyUtil.getProperties("wx");
for (Object key: pro.keySet()) {
DataUtil.PAYMAP.put((String)key, (String)pro.get(key));
}
ScheduleJobModel job = new ScheduleJobModel();
job.setJobId("jfQuartz");
job.setJobName("积分提醒");
job.setJobStatus("1");
job.setJobGroup("sys");
/*
这些星号由左到右按顺序代表 : * * * * * * *
格式: [秒] [分] [小时] [日] [月] [周] [年]
*/
job.setCronExpression("0/20 * * * * ? *");
/*ScheduleJobModel jobbd = new ScheduleJobModel();
jobbd.setJobId("dbQuartz");
jobbd.setJobName("储值提醒");
jobbd.setJobStatus("1");
jobbd.setJobGroup("sys");*/
/*
这些星号由左到右按顺序代表 : * * * * * * *
格式: [秒] [分] [小时] [日] [月] [周] [年]
*/
//jobbd.setCronExpression("0/20 * * * * ? *");
try {
QuartzManager.addJob(job, JifenQuartzServiceImpl.class);
QuartzManager.Map.put(job.getJobId(), job.getJobGroup());
//QuartzManager.addJob(jobbd, BdbQuartzServiceImpl.class);
//QuartzManager.Map.put(jobbd.getJobId(), jobbd.getJobGroup());
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这里定义了2个定时器的任务,一个是关于积分变动的,另一个是关于储值的定时器任务,这里的很多类和功能我们内部都进行了封装,就不做过多的赘述。我们看到这里设置了job的id,job的name,状态和组等,还有一个比较重要的时间表达式,不会的时间规则可以上网上查看,接下来将这个任务add进去,然后 JifenQuartzServiceImpl.class里是具体的定时器逻辑.
首先需要提到2点,1.需要指定的微信公众号的APPID,APPSECRET,发送的模版ID,微信用户的openid,这些都是需要按照微信开发API的规范来完成。否则会出现发送失败,我在之前一直会报发送失败,状态码为40003,就是无效的openid,因为你发送信息给这个微信用户,必须该用户关注了该公众号,否则拿不到他的openid,自然也就发送失败,之后还出现了400037的状态,模版id错误,这些都必须要按照规范来,只有返回状态0才代表发送成功,并且用户才能收到提醒。
2.一旦查询到了新插入的积分记录,我们就进行发送提醒,然后把这条记录由原来的F修改为T,如果发送失败的话,则修改状态为D,因为我们dao的查询就是根据创建时间>getdate()-1和状态等于'F'来进行判断的。