倒计时~开始!
1、控制台部分:将上节官方提供的tbs console admin(点击下载)扔到tomcat里启动,如何使用tomcat请自行网上查询。启动成功后如下图所示(参数可能与图中不一样):
2、新建一个空项目,需要的maven依赖如下,当然也可以直接下载作者的示例工程。
示例工程下载:点击下载
<?xml version="1.0" encoding="UTF-8"?>
<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.oschina.wed</groupId>
<artifactId>tbschedule-wed-demo</artifactId>
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-version>4.0.0.RELEASE</spring-version>
<logback-version>1.1.7</logback-version>
<slf4j-version>1.7.5</slf4j-version>
<java.version>1.7</java.version>
<testng-version>6.9.6</testng-version>
<junit-version>4.11</junit-version>
</properties>
<dependencies>
<!-- spring dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- commons -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.1</version>
</dependency>
<!--tbs-->
<dependency>
<groupId>com.taobao.pamirs.schedule</groupId>
<artifactId>tbschedule</artifactId>
<version>3.3.3.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.3</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- logback & slf4j dependencies -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${slf4j-version}</version>
</dependency>
<!-- test -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3、现在跟着作者敲代码,不需要理解为什么,你只需要知道5分钟之后你已经可以使用tbs了:
a)tbs调度器工厂类
package com.oschina.wed;
import com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* TBSchedule调度器工厂类
*/
public class TBScheduleFactory {
/**
* 获取一个调度器实例
* @param zkAddress 注册中心地址
* @param taskPath 调度器注册路径
* @param zkConnctionTimeout 注册中心连接超时时长
* @param aclUserName 如需加密,此为用户名,tbs默认采用zookeeper digest加密方式
* @param aclPwd 如需加密,此为密码,tbs默认采用zookeeper digest加密方式
* @return
*/
public static TBScheduleManagerFactory getTbsFactory(String zkAddress, String taskPath, String zkConnctionTimeout, String aclUserName, String aclPwd) {
try {
//tbs调度器的编程式注册
TBScheduleManagerFactory tbScheduleManagerFactory = new TBScheduleManagerFactory();
Map<String, String> zkConfig = new HashMap<String, String>();
zkConfig.put("zkConnectString", zkAddress);
zkConfig.put("rootPath", taskPath);
zkConfig.put("zkSessionTimeout", zkConnctionTimeout);
zkConfig.put("userName", aclUserName);
zkConfig.put("password", aclPwd);
tbScheduleManagerFactory.setZkConfig(zkConfig);
//初始化zk链接,建立注册信息
tbScheduleManagerFactory.init();
return tbScheduleManagerFactory;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}
b)任务执行类
package com.oschina.wed;
import com.taobao.pamirs.schedule.IScheduleTaskDealSingle;
import com.taobao.pamirs.schedule.TaskItemDefine;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 示例一:演示tbs基本配置与单机调用
*
* @see com.oschina.wed.TransactionVoucher 示例用交易凭证对象,我们用它来演示各类场景运算。
* @author wed
* @since 2017-12-18
*/
@Component("firstScheduleDemo")
public class FirstScheduleDemo implements IScheduleTaskDealSingle<TransactionVoucher> {
/**
* 数据加工方法,处理来自selectTasks()返回的数据
* @param transactionVoucher 凭证对象
* @param owenSign 隔离作用域
* @return 是否处理成功
* @throws Exception
*/
@Override
public boolean execute(TransactionVoucher transactionVoucher, String owenSign) throws Exception {
//数据加工开始,这里只是简单的输出数据内容
System.out.println(ToStringBuilder.reflectionToString(transactionVoucher));;
//数据处理结束,返回成功或失败
return true;
}
@Override
public List<TransactionVoucher> selectTasks(String s, String s1, int i, List<TaskItemDefine> list, int i1) throws Exception {
//模拟生成一条交易凭证
final TransactionVoucher tmp = new TransactionVoucher();
tmp.setId(1L);
tmp.setDirection(0);
tmp.setAdmount(100L);
return new ArrayList<TransactionVoucher>(){
private static final long serialVersionUID = -1772752676884292373L;
{
add(tmp);
}};
}
/**
* getComparator()让用户自定义生成两个task之间的比较方法,避免重复的task执行。
* 有需要的朋友自行实现该方法,并可在selectTask()方法返回前去除重复数据,本系列
* 教程不对该方法多做讲解
*
* @return 自定义比较器
*/
@Override
public Comparator<TransactionVoucher> getComparator() {
return null;
}
}
c)示例task类
package com.oschina.wed;
public class TransactionVoucher {
/**
* 凭证唯一编码
*/
private Long id;
/**
* 交易方向(0:收入 1:支出)
*/
private Integer direction;
/**
* 交易金额(单位:分)
*/
private Long admount;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getDirection() {
return direction;
}
public void setDirection(Integer direction) {
this.direction = direction;
}
public Long getAdmount() {
return admount;
}
public void setAdmount(Long admount) {
this.admount = admount;
}
@Override
public String toString() {
return "TransactionVoucher{" +
"id=" + id +
", direction=" + direction +
", admount=" + admount +
'}';
}
}
d)入口类
package com.oschina.wed;
import com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
/**
* 本想为大家演示脱离Spring的纯java使用tbs,但由于其注册中心
* 需利用反射在spring容器注册的bean中获取需要调度的Bean
* 故此处声明Spring容器的作用只在于将job firstScheduleDemo
* 注入容器,并把容器交由tbs调度器管理。
*
* @param args
*/
public static void main(String... args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
//实例化一个调度器
TBScheduleManagerFactory tbScheduleManagerFactory = TBScheduleFactory.getTbsFactory(
"172.16.60.12:2181,172.16.60.16:2182,172.16.60.33:2183",
"/tbschedule/wed/tasks",
"60000",
"",
"");
//Spring容器交由tbs调度器管理
tbScheduleManagerFactory.setApplicationContext(context);
while (true){
}
}
}
上方的zookeeper地址改成你自己的zookeeper地址,单机,集群均可。接着run一下,正常的话会看下以下日志:
此时不停刷屏得DEBUG的日志分别为:1)zk链接日志;2)调度器信息写入日志;3)内置心跳日志。现在我们也不去过问为什么,直接在Log4j中屏蔽掉DEBUG级别日志。之后重启,是不是清爽多了?编码的部分到此结束,相信一个熟练使用IDE的朋友根本用不了5分钟。
4、控制台配置
现在我们把填入tbs调度器中的各项参数也填入到控制台,点击保存后,再点击管理主页。
此时的管理主页如图:
小伙伴们可以进一步检查我们的调度程序是否启动成功,怎么看呢?点击机器管理,如下图如果发现你的IP在处理任务机列表里那么恭喜了,注册成功,可以开始调度了!
5、调度器以及任务配置
接下来跟着作者配置就好,所有的配置项讲解将在下一节教学讲到:
a)调度策略配置:
b)任务管理配置:
6、倒计时咔!4分59秒59
当我们回到程序,你多半会失望的发现各种各样的小问题,那么请倒回去再仔细看一遍教学。又如果你看到了以下日志:
恭喜你!调度已经成功开始,并且我们构造的交易凭证类明细也正常的输出了。