qschedule client
2015-10-19 20:20
246 查看
如何使用
1.环境配置
spring工程
非spring工程
2.注册application
升级到1.0.2版本解决方案
使用qschedule
1.0.2及以上版本
使用qschedule
1.0.1及以下版本
3.配置myid
4.编写job
非spring工程
spring工程xml配置
spring工程annotation配置
任务跟踪
异步任务
获得参数
在pom文件中引入qschedule包依赖
spring工程
非spring工程
升级到1.0.2版本解决方案
1.升级common-core到8.1.8,qschedule-client到1.0.2,qmq-client 和 qmq-api 到1.3.4
2.在应用中心注册应用,将应用中心生成的qunar-app.properties文件替换以前的quanr-app.properties文件。
使用qschedule 1.0.2及以上版本
从qschedule 1.0.2版本开始,业务方需在应用中心注册应用。
步骤如下:
使用qschedule 1.0.1及以下版本
在src/main/resources文件夹下创建quanr-app.properties并配置organization、application和owner的值。
以下是demo,仅作参考,属性值不要照抄
src/main/resources/qunar-app.properties
在各profile文件夹下创建myid并配置环境标识名,一般用于dev和beta
src/main/resources.dev/myid
src/main/resources.betaA/myid
src/main/resources.betaB/myid
非spring工程
定义job,实现worker接口的doWork方法
Worker
simple demo
使用ScheduleProvider注册job
ScheduleProvider
simple demo
spring工程xml配置
定义job,不需要强制实现Worker接口。
定义doWork方法,方法名任意,可以不带参数。
在spring文件中配置<qschedule:config>标签,设置address和port属性。port属性可省略默认值为20070。此标签等价于创建了ScheduleProvider实例。
在spring文件中配置<qschedule:task>标签,设置id、ref、method属性。id为job的名字,全局唯一。此标签等价于ScheduleProvider的schedule方法。
spring工程annotation配置
定义job,不需要强制实现Worker接口。
定义doWork方法,方法名任意,可以不带参数。
在doWork方法上配置注解 @QSchedule,此注解等价于ScheduleProvider的schedule方法。
在spring文件中配置<qschedule:config>标签,设置address和port属性。port属性可省略默认值为20070。此标签等价于创建了ScheduleProvider实例。
任务跟踪
TaskMonitor
simple demo
异步任务
TaskMonitor
simple code
获得参数
Parameter
simple demo
1.环境配置
spring工程
非spring工程
2.注册application
升级到1.0.2版本解决方案
使用qschedule
1.0.2及以上版本
使用qschedule
1.0.1及以下版本
3.配置myid
4.编写job
非spring工程
spring工程xml配置
spring工程annotation配置
任务跟踪
异步任务
获得参数
如何使用
1.环境配置
在pom文件中引入qschedule包依赖spring工程
<properties> <qschedule.version>最新版本</qschedule.version> </properties> <dependency> <groupId>qunar.tc.qschedule</groupId> <artifactId>qschedule-client</artifactId> <version>${qschedule.version}</version> </dependency>
非spring工程
<properties> <qschedule.version>最新版本</qschedule.version> </properties> <dependency> <groupId>qunar.tc.qschedule</groupId> <artifactId>qschedule-executor</artifactId> <version>${qschedule.version}</version> </dependency>
请选择qschedule最新版本,版本号查看方法如下: wiki查看qschedule发布记录:http://wiki.corp.qunar.com/pages/viewpage.action?pageId=41785333 nexus搜索qschedule-client构件:http://svn.corp.qunar.com:8081/nexus/index.html#nexus-search;quick~qschedule-client |
2.注册application
升级到1.0.2版本解决方案
1.升级common-core到8.1.8,qschedule-client到1.0.2,qmq-client 和 qmq-api 到1.3.4
2.在应用中心注册应用,将应用中心生成的qunar-app.properties文件替换以前的quanr-app.properties文件。
使用qschedule 1.0.2及以上版本
从qschedule 1.0.2版本开始,业务方需在应用中心注册应用。
步骤如下:
进入生产环境的应用中心http://pbservice.corp.qunar.com,点击创建应用 |
填写应用信息,点击保存 |
在我的应用列表,选择未审核能看到刚创建好的应用,点击详情还可以查看修改应用属性 |
当应用被管理员(RTX:zizhong.liu,zhongyuan.zhang)审批后,就能在审核通过列表里找到,点击下载就能得到qunar-app.properties文件。 |
将qunar-app.properties放入src/main/resources文件夹下。qunar-app.properties文件中包含应用的name和token。 |
#organization=tcdev #owner=[zhaohui.yu] #developer=[kelly.li] #mailGroup=[tcdev] name=tc_qschedule_demo token=KKsoGndpNHdyJoIAvRRxhlzRAdi8/RHEM9cDZE0q+zr6cN1jQf3OuC0/+pzw8CctmHCNzvwIkyoaY//KEvVaq8WBezrtHMSs9KoWXTy4h4ckQjloun0EH54s6CVnWndj8d+zf+A4f9wni3sHEzXVEKnNaHSX1u8uSwSR+ExvU1s=
使用qschedule 1.0.1及以下版本
在src/main/resources文件夹下创建quanr-app.properties并配置organization、application和owner的值。
以下是demo,仅作参考,属性值不要照抄
src/main/resources/qunar-app.properties
organization=tcdev application=qschedule_demo owner=kelly.li
organization是team的名字(比如flight-tts) application是应用的名字(比如task,固定不能修改) owner是owner的名字(和rtx名字相同) |
3.配置myid
在各profile文件夹下创建myid并配置环境标识名,一般用于dev和betasrc/main/resources.dev/myid
dev
src/main/resources.betaA/myid
betaa
src/main/resources.betaB/myid
betab
myid文件是没有后缀的 每个环境都不是必须的,有并行开发需要隔离定时调度任务的配置就行 环境标识名会追加到每个job名后面,如果你注册了一个job1,根据上面的配置在dev环境job的最终注册名为job1_dev,在betaa环境job的最终注册名为job1_betaa |
4.编写job
非spring工程
定义job,实现worker接口的doWork方法
Worker
public interface Worker { void doWork(Parameter parameter); }
simple demo
public class MyJob implements Worker { @Override public void doWork(Parameter parameter) { } }
使用ScheduleProvider注册job
ScheduleProvider
构造SchedulerProvider,registryURL为job注册的zk地址 public SchedulerProvider(String registryURL) 初始化 public void init() 注册任务,每个任务都独立线程池 void schedule(final String jobName, final Worker worker) 注册任务,多个任务共享线程池 void schedule(final String jobName, final Worker worker, final ThreadPoolExecutor executor) 销毁 public void destroy()
jobName请遵循命名规范,BU.业务线.业务(eg. tc.qschedule.demo.job1) 请不要超过50个字符 请不要使用中文 |
SchedulerProvider schedulerProvider = new SchedulerProvider(registryURL); schedulerProvider.init(); schedulerProvider.schedule("qschedule.demo.job", new MyJob()); schedulerProvider.destroy();
registryURL是job注册到zookeeper地址dev: l-zk1.plat.dev.cn6.qunar.com:2181beta: l-zk1.plat.beta.cn6:2181,l-zk2.plat.beta.cn6:2181,l-zk3.plat.beta.cn6:2181prod: l-zk1.plat.cn6:2181,l-zk2.plat.cn6:2181,l-zk3.plat.cn6:2181,l-zk4.plat.cn6:2181,l-zk5.plat.cn6:2181 |
spring工程xml配置
定义job,不需要强制实现Worker接口。
定义doWork方法,方法名任意,可以不带参数。
public class MyJob{ public void doWork(Parameter parameter) { } }
在spring文件中配置<qschedule:config>标签,设置address和port属性。port属性可省略默认值为20070。此标签等价于创建了ScheduleProvider实例。
在spring文件中配置<qschedule:task>标签,设置id、ref、method属性。id为job的名字,全局唯一。此标签等价于ScheduleProvider的schedule方法。
<?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:qschedule="http://www.qunar.com/schema/qschedule" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.qunar.com/schema/qschedule http://www.qunar.com/schema/qschedule/qschedule.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:property-placeholder location="classpath:qschedule.properties" ignore-unresolvable="true" /> <qschedule:config address="${registry.address}" port="${registry.port}" /> <bean id="myJob" class="qunar.tc.share.qschedule.job.MyJob" /> <qschedule:task id="qschedule.demo.myjob" ref="myJob" method="doWork" /> </beans>
spring工程annotation配置
定义job,不需要强制实现Worker接口。
定义doWork方法,方法名任意,可以不带参数。
在doWork方法上配置注解 @QSchedule,此注解等价于ScheduleProvider的schedule方法。
@Component public class MyJob{ @QSchedule("qschedule.demo.myjob") public void doWork(Parameter parameter) { } }
在spring文件中配置<qschedule:config>标签,设置address和port属性。port属性可省略默认值为20070。此标签等价于创建了ScheduleProvider实例。
<?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:qschedule="http://www.qunar.com/schema/qschedule" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.qunar.com/schema/qschedule http://www.qunar.com/schema/qschedule/qschedule.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:property-placeholder location="classpath:qschedule.properties" ignore-unresolvable="true" /> <context:component-scan base-package="qunar.tc.share.qschedule" /> <qschedule:config address="${registry.address}" port="${registry.port}"/> </beans>
任务跟踪
TaskMonitor
使用该日志对象写的日志会收集到调度中心 Logger getLogger(); 设置总工作规划,用于外部进度跟踪。 void setRateCapacity( int capacity); 增加进度 void addRate( int delta); 设置当前进度 void setRate( int rate);
simple demo
@Component public class ProcessWorker { @QSchedule("qschedule.demo.process") public void doWork(Parameter parameter) { TaskMonitor monitor = TaskHolder.getKeeper(); Logger logger = monitor.getLogger(); //向qshedule输出日志 logger.info("work begin"); int size = getDataSize(); //设置任务容量 monitor.setRateCapacity(size); for (int i = 0; i < size; i++) { processData(i, logger); //增加任务进度 monitor.addRate(1); //设置任务进度 monitor.setRate(i+1); } logger.error("work finish"); } public int getDataSize() { return 100; } public void processData(int i, Logger logger) { logger.info("process data {}", i); } }
异步任务
TaskMonitor
设置是否自动ack void autoAck( boolean ack); 任务完成 void finish(); 任务失败 void fail(Throwable e);
simple code
@Component public class AsyncWorker { @QSchedule(value = "qschedule.demo.async") public void doWorker() { // 要注意,这个一定要在执行任务的入口方法里调用,如果别的地方要用则传递过去 final TaskMonitor monitor = TaskHolder.getKeeper(); // 关闭自动报告任务完成 monitor.autoAck(false); new Thread(new Runnable() { @Override public void run() { // 开启一个新线程处理 try{ // 处理任务 // 任务处理完毕,汇报 monitor.finish(); }catch(Exception e){ // 如果任务处理过程中出现异常,则调用 monitor.fail(e); monitor.fail(e); } } }).start(); } }
获得参数
Parameter
获得job名称 String getJobName(); 获得任务创建时间 Date getCreatedDate(); 获得字符串型参数值 String getString(String name); 获得参数值 <T> T getProperty(String name, Class<T> clazz);
simple demo
@Component public class ParamWorker { @QSchedule(value = "qschedule.demo.param") public void doWorker(Parameter parameter) { TaskMonitor monitor = TaskHolder.getKeeper(); Logger logger = monitor.getLogger(); logger.info("jobName : {} ", parameter.getJobName()); logger.info("task create date : {} ", parameter.getCreatedDate()); logger.info("string param:{}", parameter.getString("str")); logger.info("number param:{}", parameter.getProperty("num", Integer.class)); logger.info("date param:{}", parameter.getProperty("date", Date.class)); } }
相关文章推荐
- qschedule http interface
- qschedule
- 如何修改Linux系统的默认启动级别
- 防止apk反编译的技术分析浅谈--内存修改器篇
- IOS 多线程
- Problem H: 林教主的面试整数部分转换2进制,从右往左,除二取余;小数部分从左往右,乘二取整
- 定时器的运用,延时提示框
- 存储过程
- 数学三角形问题
- 【Intermediate SQL-1 】五道较难的sql练习_大连理工软院数据库上机答案
- 黑马程序员 Java基础——多态、抽象类及接口
- javascript入门
- iOS --- 使用CoreTelephony来获取运营商信息
- Java中的基本数据类型
- Java内存溢出详解及解决方案
- Mysql学习 - 触发器和存储过程
- Linux删除乱码文件
- [20151019]SCZ训练
- 你真的了解 console 吗
- 深究递归和迭代的区别、联系、优缺点及实例对比