需求背景:创建的quartz任务需要用到三个参数,根据参数去执行并将结果入库,并且参数可修改更新。

这里,有三个参数需要传入,分别是planId、target、officeId

定义Job类:

public class StatisticsTaskService implements Job {

    private Logger logger = LoggerFactory.getLogger(StatisticsTaskService.class);

    private StatusStatisticsService statusStatisticsService = ApplicationContextHelper.getBean(StatusStatisticsService.class);

    @Override
public void execute(JobExecutionContext context) throws JobExecutionException {

JobDataMap dataMap = context.getJobDetail().getJobDataMap();
JobParameter jobParam = (JobParameter)dataMap.get(JobParameter.JOB_PARAM); String planId = jobParam.getPlanId();
String target = jobParam.getTarget();
String officeId = jobParam.getOfficeId();
//System.out.println(jobParam.toString()); //根据传入的target参数执行不同操作
if(target.equals("1")){
//执行操作1
}else if(target.equals("2")){
//执行操作2
}else{
//执行其他操作
}
logger.info("Job:"+planId+" target:"+target);
}
}

定义参数类:

public class JobParameter implements Serializable{    private static final long serialVersionUID = 1L;

    public static final String JOB_PARAM = "jobParam";

    private String planId;
private String target;
private String officeId; public String getPlanId() {
return planId;
}
public void setPlanId(String planId) {
this.planId = planId;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getOfficeId() {
return officeId;
}
public void setOfficeId(String officeId) {
this.officeId = officeId;
} @Override
public String toString() {
return "JobParameter [planId=" + planId + ", target=" + target + ", officeId=" + officeId + "]";
}
}

创建任务创建和修改方法:

1.创建任务:

public static void createScheduleJobWithParams(Scheduler scheduler, String jobName,
String jobGroup, String cronExpression, Class<? extends Job> jobClass,
        String planId,String target,String officeId) {
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroup)
.build();
//创建初始参数
JobParameter jobParam = new JobParameter();
jobParam.setPlanId(planId);
jobParam.setTarget(target);
jobParam.setOfficeId(officeId);
jobDetail.getJobDataMap().put(JobParameter.JOB_PARAM, jobParam); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(cronExpression); CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName, jobGroup).withSchedule(scheduleBuilder)
.build();
try {
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isStarted()) {
scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}

2.修改任务:

public static void updateScheduleJobWithParams(Scheduler scheduler, String jobName, String jobGroup, String cronExpression,
      String planId,String target) {
try {
TriggerKey triggerKey = getTriggerKey(jobName, jobGroup);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
//参数修改
JobKey jobKey = getJobKey(jobName, jobGroup);
JobParameter jobParam = (JobParameter) scheduler.getJobDetail(jobKey).getJobDataMap().get(JobParameter.JOB_PARAM);
jobParam.setPlanId(planId);
jobParam.setTarget(target);
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger); } catch (SchedulerException e) {
e.printStackTrace();
}
}

编码总结:

最开始时我将三个参数直接put进JobDetail的JobDataMap,发现任务中能够正常读取,但是在更新参数是发现set后值不变,不知是不是JobDataMap继承DirtyFlagMap的原因,没有深究。

后将三个参数封装为对象,并实现序列化,以对象形式传入,修改就没有问题了。

参考链接:http://sulaohuai.blog.51cto.com/10674946/1702625

Quartz带参数任务的创建与修改的更多相关文章

  1. Dom4J对XML的创建、修改、删除等操作

    Dom4j也可以很方便完成XML文档的创建.元素的修改.文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好. # 准备 首先,提供相关的jar包 ...

  2. Java带参数的线程类ParameterizedThread——即如何给Thread传递参数

    在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到.网上有大量的文章在讨论这个问题,但都没有提供很好的代码封装解决方案,这令我很吃惊.如果读者知道有官方或者第三方的实现方式,欢迎 ...

  3. SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

    SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过     存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...

  4. c#创建带参数的线程

    1.无参数线程的创建 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void showmes ...

  5. C#中创建线程,创建带参数的线程

    线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函 构造函数定义: 无参数委托 [SecuritySafeC ...

  6. 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案

    先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...

  7. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  8. Force.com微信开发系列(八)生成带参数的二维码

    为了满足用户渠道推广分析的需要,公众平台提供了生成带二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.目前有两种类型的二维码,分别是临时二维码和永久二维码 ...

  9. C# 利用反射动态创建对象——带参数的构造函数和String类型

    C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...

随机推荐

  1. Hadoop HBase概念学习系列之HMaster服务器(四)

    每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每个HRegion服务器它要维护哪些HRegion. 当一台新的HRegion服务器登录到HMaster服务器时 ...

  2. Atcoder 水题选做

    为什么是水题选做呢?因为我只会水题啊 ( 为什么是$Atcoder$呢?因为暑假学长来讲课的时候讲了三件事:不要用洛谷,不要用dev-c++,不要用单步调试.$bzoj$太难了,$Topcoder$整 ...

  3. Spring Boot Actuator RCE

    来看一下IDEA如何调试Spring Boot 先在https://github.com/artsploit/actuator-testbed下载源码 如下命令就能通过maven环境启动 mvn in ...

  4. Kubernetes1.91(K8s)安装部署过程(三)--创建高可用etcd集群

    这里的etcd集群复用我们测试的3个节点,3个node都要安装并启动,注意修改配置文件 1.TLS认证文件分发:etcd集群认证用,除了本机有,分发到其他node节点 scp ca.pem kuber ...

  5. day 30

    今日内容: 单例模式的四种方法 网络编程的介绍 单例模式: 什么是单例模式? 单例模式就是经过多次实例化,指向的是同一实例 为何要用单例模式? 可以节省内存资源 如何用单例模式? 方式一:利用绑定方法 ...

  6. 十二生肖swift1.2

    2015年八月的最后一个星期,暑假就快落幕,说起来觉得这个暑假挺后悔没去实习,就在项目组里这边打打酱油,这里做点修改,不过自学了一些mapnik,还有nodejs和django的基础开发,其实还是很喜 ...

  7. odoo销售转生产

    <!--form view 一个form视图足以--><record id="view_sale_tomrp_form" model="ir.ui.vi ...

  8. Feeling_2018_5_21

    “像我们这种普通的家庭,爸爸妈妈年纪大了有时候需要我们.” 或许真正的长大,不是去了多少地方,走了多少路,爱了多少人,赚了多少钱,而是你能以多大的努力为你的亲人.家庭负责任.如果你现在觉得自己过得很轻 ...

  9. 20155308《网络对抗》Exp4 恶意代码分析

    20155308<网络对抗>Exp4 恶意代码分析 实践说明 实践目标 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...

  10. WPF应用

    代码 private void button1_Click(object sender, RoutedEventArgs e) { calculate sa = new calculate(int.P ...