定时任务QuartzJob

来源:互联网 发布:迅雷手游网络加速器 编辑:程序博客网 时间:2024/06/01 07:36
首先通过前端调用进入saveUserToPayMent接口,若price大于0,接口返回前端一个charge对象,之后程序进入webhook中监听支付状态,若支付成功,则添加一个计时任务。

//添加一个定时任务

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付费任务,直接走上述流程。



0 0