您的位置:首页 > 其它

淘宝开源项目TbSchedule的使用

2016-11-04 12:52 375 查看


淘宝开源项目TbSchedule的使用


项目架构

springboot+tbschedule实现调度

项目结构图





项目搭建

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.zto.schedule</groupId>
<artifactId>zto-schedule</artifactId>
<version>0.0.1-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.7</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.taobao.pamirs.schedule</groupId>
<artifactId>tbschedule</artifactId>
<version>3.2.14</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.1-alpha</version>
</dependency>
</dependencies>
</project>


application.yml

---
spring.profiles: dev

server:
context-path: /zto-schedule

logging:
level:
root: INFO

job:
zkConfig:
zkConnectString: 10.10.4.40:2181
rootPath: /tb-schedule/test
zkSessionTimeout: 60000
userName: admin
password: admin
isCheckParentPath: true


ScheduleJobConfiguration.java

package com.zto.schedule.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory;

@Configuration
public class ScheduleJobConfiguration{

@Bean(initMethod = "init")
public TBScheduleManagerFactory tbScheduleManagerFactory(
@Value("${job.zkConfig.zkConnectString}")String zkConnectString,
@Value("${job.zkConfig.rootPath}")String rootPath,
@Value("${job.zkConfig.zkSessionTimeout}")String zkSessionTimeout,
@Value("${job.zkConfig.userName}")String userName,
@Value("${job.zkConfig.password}")String password,
@Value("${job.zkConfig.isCheckParentPath}")String isCheckParentPath) {
TBScheduleManagerFactory tbScheduleManagerFactory = new TBScheduleManagerFactory();
Map<String, String> zkConfig = new HashMap<String, String>();
zkConfig.put("zkConnectString", zkConnectString);
zkConfig.put("rootPath", rootPath);
zkConfig.put("zkSessionTimeout", zkSessionTimeout);
zkConfig.put("userName", userName);
zkConfig.put("password", password);
zkConfig.put("isCheckParentPath", isCheckParentPath);
tbScheduleManagerFactory.setZkConfig(zkConfig);
return tbScheduleManagerFactory;
}
}


或者xml中配置

init.properties

#注册中心地址
schedule.zookeeper.address=10.10.4.40:2181
#定时任务根目录,任意指定,调度控制台配置时对应
schedule.root.catalog=/tb-schedule/test
#账户,任意指定,调度控制台配置时对应
schedule.username=admin
#密码,任意指定,调度控制台配置时对应
schedule.password=admin
#超时配置
schedule.timeout=60000


applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 
<!-- 引入外部文件 -->
<context:property-placeholder location="classpath:init.properties" />

<bean id="scheduleManagerFactory"
class="com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory"
init-method="init">
<property name="zkConfig">
<map>
<entry key="zkConnectString" value="${schedule.zookeeper.address}" />
<entry key="rootPath" value="${schedule.root.catalog}" />
<entry key="zkSessionTimeout" value="${schedule.timeout}" />
<entry key="userName" value="${schedule.username}" />
<entry key="password" value="${schedule.password}" />
<entry key="isCheckParentPath" value="true" />
</map>
</property>
</bean>

</beans>


TaskModel.java

package com.zto.schedule.test;

public class TaskModel {

private String name;
private String job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public TaskModel(String name, String job) {
super();
this.name = name;
this.job = job;
}
public TaskModel() {
super();
}

}


 * 1、IScheduleTaskDeal 调度器对外的基础接口,是一个基类,并不能被直接使用

 * 2、IScheduleTaskDealSingle 单任务处理的接口,继承 IScheduleTaskDeal

 * 3、IScheduleTaskDealMulti 可批处理的任务接口,继承 IScheduleTaskDeal

* @param taskParameter  任务的自定义参数
* @param ownSina  当前环境名称

* @param taskQueueNum  当前任务类型的任务队列数量

* @param taskItemList  当前调度服务器,分配到的可处理队列

* @param eachFetchDataNum 每次获取数据的数量

IScheduleTaskDealSingleTest.java

package com.zto.schedule.test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.taobao.pamirs.schedule.IScheduleTaskDealSingle;
import com.taobao.pamirs.schedule.TaskItemDefine;

@Component("iScheduleTaskDealSingleTest")
public class IScheduleTaskDealSingleTest implements IScheduleTaskDealSingle<TaskModel>{

private static final Logger LOG = LoggerFactory.getLogger(IScheduleTaskDealSingleTest.class);

@Override
public Comparator<TaskModel> getComparator() {
return null;
}
@Override
public List<TaskModel> selectTasks(String taskParameter, String ownSign, int taskQueueNum,
List<TaskItemDefine> taskItemList, int eachFetchDataNum) throws Exception {

//LOG.info("IScheduleTaskDealSingleTest配置的参数,taskParameter:{},ownSina:{},taskQueueNum:{},taskItemList:{}, eachFetchDataNum:{}", taskParameter, ownSign, taskQueueNum, taskItemList, eachFetchDataNum);

LOG.info("IScheduleTaskDealSingleTest选择任务列表开始啦..........");
List<TaskModel> models = new ArrayList<TaskModel>();
models.add(new TaskModel(String.valueOf(System.currentTimeMillis()), "taosirTest1"));
models.add(new TaskModel(String.valueOf(System.currentTimeMillis()), "taosirTest2"));

return models;

}
@Override
public boolean execute(TaskModel model, String ownSign) throws Exception {

LOG.info("IScheduleTaskDealSingleTest执行开始啦.........." + new Date());
System.out.println(model);
return true;

}

}


最后在Application中启动即可

Application.java

package com.zto.schedule;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ImportResource;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableCaching
@EnableConfigurationProperties
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
//@ImportResource({"classpath*:*.xml"})
//@EnableScheduling
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}


当然还要在调度中心配置相关参数

连接配置



创建新的调度策略(新建的时候是启动状态,先关闭掉,等程序启动之后在开始,不然一直莫名其妙的错误)



新建任务管理



目前就这些了。启动项目



如图,已经启动成功

然后启动调度任务



之后查看控制台日志,15秒钟执行一次.........   



有一个奇葩的地方就是任务管理里面机器如果超过四个没有释放的话,调度好像就不执行.
之后等机器释放掉之后才能再次使用........

我屮艸芔茻,为什么我的图看不清楚.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: