TBSchedule应用实战(一)—— 五分钟开始你的调度之旅

原创
2017/12/18 16:25
阅读数 4.5K

倒计时~开始!

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

当我们回到程序,你多半会失望的发现各种各样的小问题,那么请倒回去再仔细看一遍教学。又如果你看到了以下日志:

恭喜你!调度已经成功开始,并且我们构造的交易凭证类明细也正常的输出了。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
1
分享
返回顶部
顶部