//添加一个定时任务
QuartzJob quartz = new QuartzJob();String now = Utils.getNowTime( "yyyy-MM-dd HH:mm:ss" );
ScheduleJob job = new ScheduleJob();
job .setCronExpression( "0/10 * * * * ?" );(十秒循环一次)
job .setJobName(String.valueOf( pay .getLiveid()));
job .setJobGroup( "price_jobs" ); //付费任务
job.setNow(now);
job.setContext(request.getSession().getServletContext());
job .setPayment( pay );quartz.addjob(job);
调用quartz中addjob方法添加一个定时任务。
/**
* 添加一个定时任务
* */
public void addjob(ScheduleJob scheduleJob){
try {
scheduler =gSchedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail(scheduleJob.getJobName(),scheduleJob.getJobGroup(), this.getClass());// 任务名,任务组,任务执行类
// 触发器
CronTrigger trigger = new CronTrigger(scheduleJob.getJobName(),TRIGGER_GROUP_NAME);// 触发器名,触发器组
trigger.setCronExpression(scheduleJob.getCronExpression());// 触发器时间设定
jobDetail.getJobDataMap().put("scheduleJob",scheduleJob);
scheduler.scheduleJob(jobDetail,trigger);
// 启动
scheduler.start();
System.out.println("------------------end----------------");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
通过配置文件applicationContext配置计时任务。
<!-- 工作的bean -->
<beanid="myJob"class="com.sas.pdg.mrr.util.QuartzJob"/>
<!-- job的配置开始 -->
<beanid="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<propertyname="targetObject">
<refbean="myJob"/>
</property>
<propertyname="targetMethod">
<value>execute</value>
</property>
</bean>
<!-- job的配置结束 -->
通过配置文件进入quartz的execute方法
long s = Utils.getDistanceTime(scheduleJob.getNow(), Utils.getNowTime("yyyy-MM-dd HH:mm:ss"));
if(s > 59){
scheduler.pauseJob(scheduleJob.getJobName(),scheduleJob.getJobGroup());
System.out.println("------------------------job pause-----------------------");
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(scheduleJob.getContext());
IdentityService is = (IdentityService) ctx.getBean("identityService");
is.updateQuestionStateAndSendTemplate(scheduleJob.getPayment());
}
判断启动时间与当前时间是否相差59秒以上,若大于59秒以上表明用户没有在一分钟内撤回信息,则暂停计时任务,更改数据库信息并且发送模板消息(模板消息暂时移除)。
若用户在一分钟内点击撤回信息,则前端调用updateWithdrawQuestions接口,查询要撤回问题是否已经超过一分钟,若超过,则返回-1表示该问题不能撤离。若未超过,
且判断支付类型为提问支付且支付状态为已支付,
Map<String,Object> map = new HashMap<String, Object>();
map.put("description","撤销问题退款");
map.put("chargeId",live.getOrderid());
Refund refund = PPPPayMent.refund(map);
先执行退款,在增加一条payment信息,将price_jobs添加到job组中
job.setJobGroup("price_jobs");//付费任务
通过调用quartz调用暂停计时任务接口方法
//暂停当前定时任务
QuartzJob quartz =new QuartzJob();
job.setJobName(String.valueOf(lid));
quartz.pauseTask(job);
调用quartz中的pauseTask方法:
/**
* 停止一个定时任务
* */
public void pauseTask(ScheduleJobscheduleJob){
try{
scheduler =gSchedulerFactory.getScheduler();
scheduler.pauseJob(scheduleJob.getJobName(),scheduleJob.getJobGroup());
System.out.println("任务名称 = [" +scheduleJob.getJobName()+ "]已暂停");
}catch(SchedulerExceptione){
e.printStackTrace();
}
}
若 判断支付类型不为提问支付或者支付状态为未支付,则只暂停计时任务
job.setJobGroup("0price_jobs");//0付费任务
//暂停当前定时任务
QuartzJob quartz = new QuartzJob();
job.setJobName(String.valueOf(lid));
quartz.pauseTask(job);
若price不大与0,且role为2说明为免费提问,因为是免费,所以不走ping++支付流程,因此不会走webhook,所以在处理完相应表中数据后(增加提问,修改数目,增加支付)后直接添加一个定时任务,与上述流程不同的是
job.setJobGroup("0price_jobs");//0付费任务
此处group中添加的是0付费任务,直接走上述流程。