qschedule client

来源:互联网 发布:剑灵召唤师卡刀软件 编辑:程序博客网 时间:2024/05/22 12:36

如何使用

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_demotoken=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=tcdevapplication=qschedule_demoowner=kelly.li
organization是team的名字(比如flight-tts)
application是应用的名字(比如task,固定不能修改)
owner是owner的名字(和rtx名字相同)

3.配置myid

在各profile文件夹下创建myid并配置环境标识名,一般用于dev和beta

src/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个字符
请不要使用中文

simple demo

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方法。

@Componentpublic 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

@Componentpublic 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
设置是否自动ackvoid autoAck( boolean ack);任务完成void finish();任务失败void fail(Throwable e);

simple code

@Componentpublic 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

@Componentpublic 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));    }}
0 0
原创粉丝点击