您的位置:首页 > 其它

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配置
任务跟踪
异步任务
获得参数


如何使用


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

@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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: