• 轻量级分布式任务调度框架(二、LTS编译、打包、部署)


    接上文......

    (7) 项目编译打包

    项目主要采用maven进行构建,目前提供shell脚本的打包。环境依赖:Java(jdk1.6+) Maven

    使用一般分为两种:

    (7.1) Maven构建

    可以通过maven命令将lts的jar包上传到本地仓库中。在父pom.xml中添加相应的repository,并用deploy命令上传即可。具体引用方式可以参考lts中的例子即可。

    (7.2) 直接Jar引用

    需要将lts的各个模块打包成单独的jar包,并且将所有lts依赖包引入。具体引用哪些jar包可以参考lts中的例子即可。

    (8) JobTracker和LTS-Admin部署

    提供(cmd)windows和(shell)linux两种版本脚本来进行编译和部署:

    (1) 运行根目录下的sh build.sh或build.cmd脚本,会在dist目录下生成lts-{version}-bin文件夹

    (2) 下面是其目录结构,其中bin目录主要是JobTracker和LTS-Admin的启动脚本。jobtracker 中是 JobTracker的配置文件和需要使用到的jar包,lts-admin是LTS-Admin相关的war包和配置文件。

    lts-{version}-bin的文件结构

    -- lts-${version}-bin
        |-- bin
        |   |-- jobtracker.cmd
        |   |-- jobtracker.sh
        |   |-- lts-admin.cmd
        |   |-- lts-admin.sh
        |   |-- lts-monitor.cmd
        |   |-- lts-monitor.sh
        |   |-- tasktracker.sh
        |-- conf
        |   |-- log4j.properties
        |   |-- lts-admin.cfg
        |   |-- lts-monitor.cfg
        |   |-- readme.txt
        |   |-- tasktracker.cfg
        |   |-- zoo
        |       |-- jobtracker.cfg
        |       |-- log4j.properties
        |       |-- lts-monitor.cfg
        |-- lib
        |   |-- *.jar
        |-- war
            |-- jetty
            |   |-- lib
            |       |-- *.jar
            |-- lts-admin.war
    

    (3) JobTracker启动。如果你想启动一个节点,直接修改下conf/zoo下的配置文件,然后运行 sh jobtracker.sh zoo start即可,如果你想启动两个JobTracker节点,那么你需要拷贝一份zoo,譬如命名为zoo2,修改下zoo2下的配置文件,然后运行sh jobtracker.sh zoo2 start即可。logs文件夹下生成jobtracker-zoo.out日志。
    (4) LTS-Admin启动,修改conf/lts-monitor.cfg和conf/lts-admin.cfg下的配置,然后运行bin下的sh lts-admin.sh或lts-admin.cmd脚本即可。logs文件夹下会生成lts-admin.out日志,启动成功在日志中会打印出访问地址,用户可以通过这个访问地址访问了。

    (9) JobClient(部署)使用

    需要引入lts的jar包有lts-jobclient-{version}.jar,lts-core-{version}.jar 及其它第三方依赖jar。

    (9.1) API方式启动

    JobClient jobClient = new RetryJobClient();
    jobClient.setNodeGroup("test_jobClient");
    jobClient.setClusterName("test_cluster");
    jobClient.setRegistryAddress("zookeeper://127.0.0.1:2181");
    jobClient.start();
    
    // 提交任务
    Job job = new Job();
    job.setTaskId("3213213123");
    job.setParam("shopId", "11111");
    job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
    // job.setCronExpression("0 0/1 * * * ?");  // 支持 cronExpression表达式
    // job.setTriggerTime(new Date()); // 支持指定时间执行
    Response response = jobClient.submitJob(job);
    
    

    (9.2) Spring XML方式启动

    <bean id="jobClient" class="com.github.ltsopensource.spring.JobClientFactoryBean">
        <property name="clusterName" value="test_cluster"/>
        <property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
        <property name="nodeGroup" value="test_jobClient"/>
        <property name="masterChangeListeners">
            <list>
                <bean class="com.github.ltsopensource.example.support.MasterChangeListenerImpl"/>
            </list>
        </property>
        <property name="jobFinishedHandler">
            <bean class="com.github.ltsopensource.example.support.JobFinishedHandlerImpl"/>
        </property>
        <property name="configs">
            <props>
                <!-- 参数 -->
                <prop key="job.fail.store">leveldb</prop>
            </props>
        </property>
    </bean>
    

    (9.3) Spring 全注解方式

    @Configuration
    public class LTSSpringConfig {
    
        @Bean(name = "jobClient")
        public JobClient getJobClient() throws Exception {
            JobClientFactoryBean factoryBean = new JobClientFactoryBean();
            factoryBean.setClusterName("test_cluster");
            factoryBean.setRegistryAddress("zookeeper://127.0.0.1:2181");
            factoryBean.setNodeGroup("test_jobClient");
            factoryBean.setMasterChangeListeners(new MasterChangeListener[]{
                    new MasterChangeListenerImpl()
            });
            Properties configs = new Properties();
            configs.setProperty("job.fail.store", "leveldb");
            factoryBean.setConfigs(configs);
            factoryBean.afterPropertiesSet();
            return factoryBean.getObject();
        }
    }
    

    (10)TaskTracker(部署使用)

    需要引入lts的jar包有lts-tasktracker-{version}.jar,lts-core-{version}.jar 及其它第三方依赖jar。

    (10.1)定义自己的任务执行类

    public class MyJobRunner implements JobRunner {
        @Override
        public Result run(JobContext jobContext) throws Throwable {
            try {
                // TODO 业务逻辑
                // 会发送到 LTS (JobTracker上)
                jobContext.getBizLogger().info("测试,业务日志啊啊啊啊啊");
    
            } catch (Exception e) {
                return new Result(Action.EXECUTE_FAILED, e.getMessage());
            }
            return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈");
        }
    }
    

    (10.2) API方式启动

    TaskTracker taskTracker = new TaskTracker();
    taskTracker.setJobRunnerClass(MyJobRunner.class);
    taskTracker.setRegistryAddress("zookeeper://127.0.0.1:2181");
    taskTracker.setNodeGroup("test_trade_TaskTracker");
    taskTracker.setClusterName("test_cluster");
    taskTracker.setWorkThreads(20);
    taskTracker.start();
    

    (10.3) Spring XML方式启动

    <bean id="taskTracker" class="com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean" init-method="start">
        <property name="jobRunnerClass" value="com.github.ltsopensource.example.support.MyJobRunner"/>
        <property name="bizLoggerLevel" value="INFO"/>
        <property name="clusterName" value="test_cluster"/>
        <property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
        <property name="nodeGroup" value="test_trade_TaskTracker"/>
        <property name="workThreads" value="20"/>
        <property name="masterChangeListeners">
            <list>
                <bean class="com.github.ltsopensource.example.support.MasterChangeListenerImpl"/>
            </list>
        </property>
        <property name="configs">
            <props>
                <prop key="job.fail.store">leveldb</prop>
            </props>
        </property>
    </bean>
    

    (10.4) Spring注解方式启动

    @Configuration
    public class LTSSpringConfig implements ApplicationContextAware {
        private ApplicationContext applicationContext;
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    	@Bean(name = "taskTracker")
        public TaskTracker getTaskTracker() throws Exception {
            TaskTrackerAnnotationFactoryBean factoryBean = new TaskTrackerAnnotationFactoryBean();
            factoryBean.setApplicationContext(applicationContext);
            factoryBean.setClusterName("test_cluster");
            factoryBean.setJobRunnerClass(MyJobRunner.class);
            factoryBean.setNodeGroup("test_trade_TaskTracker");
            factoryBean.setBizLoggerLevel("INFO");
            factoryBean.setRegistryAddress("zookeeper://127.0.0.1:2181");
            factoryBean.setMasterChangeListeners(new MasterChangeListener[]{
                    new MasterChangeListenerImpl()
            });
            factoryBean.setWorkThreads(20);
            Properties configs = new Properties();
            configs.setProperty("job.fail.store", "leveldb");
            factoryBean.setConfigs(configs);
    
            factoryBean.afterPropertiesSet();
    //        factoryBean.start();
            return factoryBean.getObject();
        }
    }
    

    (11) 参数说明

    参数说明

    (12) 使用建议

    一般在一个JVM中只需要一个JobClient实例即可,不要为每种任务都新建一个JobClient实例,这样会大大的浪费资源,因为一个JobClient可以提交多种任务。相同的一个JVM一般也尽量保持只有一个TaskTracker实例即可,多了就可能造成资源浪费。当遇到一个TaskTracker要运行多种任务的时候,请参考下面的 "一个TaskTracker执行多种任务"。

    (12.1) 一个TaskTracker执行多种任务

    有的时候,业务场景需要执行多种任务,有些人会问,是不是要每种任务类型都要一个TaskTracker去执行。我的答案是否定的,如果在一个JVM中,最好使用一个TaskTracker去运行多种任务,因为一个JVM中使用多个TaskTracker实例比较浪费资源(当然当你某种任务量比较多的时候,可以将这个任务单独使用一个TaskTracker节点来执行)。那么怎么才能实现一个TaskTracker执行多种任务呢。下面是我给出来的参考例子。

    /**
     * 总入口,在 taskTracker.setJobRunnerClass(JobRunnerDispatcher.class)
     * JobClient 提交 任务时指定 Job 类型  job.setParam("type", "aType")
     */
    public class JobRunnerDispatcher implements JobRunner {
    
        private static final ConcurrentHashMap<String/*type*/, JobRunner>
                JOB_RUNNER_MAP = new ConcurrentHashMap<String, JobRunner>();
    
        static {
            JOB_RUNNER_MAP.put("aType", new JobRunnerA()); // 也可以从Spring中拿
            JOB_RUNNER_MAP.put("bType", new JobRunnerB());
        }
    
        @Override
        public Result run(JobContext jobContext) throws Throwable {
            Job job = jobContext.getJob();
            String type = job.getParam("type");
            return JOB_RUNNER_MAP.get(type).run(job);
        }
    }
    
    class JobRunnerA implements JobRunner {
        @Override
        public Result run(JobContext jobContext) throws Throwable {
            //  TODO A类型Job的逻辑
            return null;
        }
    }
    
    class JobRunnerB implements JobRunner {
        @Override
        public Result run(JobContext jobContext) throws Throwable {
            // TODO B类型Job的逻辑
            return null;
        }
    }
    
    

    (12.2) TaskTracker的JobRunner测试

    一般在编写TaskTracker的时候,只需要测试JobRunner的实现逻辑是否正确,又不想启动LTS进行远程测试。为了方便测试,LTS提供了JobRunner的快捷测试方法。自己的测试类集成com.github.ltsopensource.tasktracker.runner.JobRunnerTester即可,并实现initContextnewJobRunner方法即可。如lts-examples中的例子:

    public class TestJobRunnerTester extends JobRunnerTester {
    
        public static void main(String[] args) throws Throwable {
            //  Mock Job 数据
            Job job = new Job();
            job.setTaskId("2313213");
    
            JobContext jobContext = new JobContext();
            jobContext.setJob(job);
    
            JobExtInfo jobExtInfo = new JobExtInfo();
            jobExtInfo.setRetry(false);
    
            jobContext.setJobExtInfo(jobExtInfo);
    
            // 运行测试
            TestJobRunnerTester tester = new TestJobRunnerTester();
            Result result = tester.run(jobContext);
            System.out.println(JSON.toJSONString(result));
        }
    
        @Override
        protected void initContext() {
            // TODO 初始化Spring容器
        }
    
        @Override
        protected JobRunner newJobRunner() {
            return new TestJobRunner();
        }
    }
    

    (12.3) Spring Quartz Cron任务无缝接入

    对于Quartz的Cron任务只需要在Spring配置中增加一下代码就可以接入LTS平台

    <bean class="com.github.ltsopensource.spring.quartz.QuartzLTSProxyBean">
        <property name="clusterName" value="test_cluster"/>
        <property name="registryAddress" value="zookeeper://127.0.0.1:2181"/>
        <property name="nodeGroup" value="quartz_test_group"/>
    </bean>
    

    (12.4) Spring Boot 支持

    @SpringBootApplication
    @EnableJobTracker       // 启动JobTracker
    @EnableJobClient        // 启动JobClient
    @EnableTaskTracker      // 启动TaskTracker
    @EnableMonitor          // 启动Monitor
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    剩下的就只是在application.properties中添加相应的配置就行了, 具体见lts-example中的com.github.ltsopensource.examples.springboot包下的例子


    轻量级分布式任务调度框架LTS系列

    轻量级分布式任务调度框架(一、LTS简介、特点、工作流程)
    轻量级分布式任务调度框架(二、LTS编译、打包、部署)
    轻量级分布式任务调度框架(三、LTS简单集成springboot项目)

  • 相关阅读:
    eclipse中的项目无法在build/classes目录下生成.class字节码
    nginx的权限问题(Permission denied)解决办法
    application/x-www-form-urlencoded、application/json、multipart/form-data、text/xml简单总结
    jackson的使用和详解
    博客园自定义样式
    java基础
    k8s
    系统服务构建运维
    私有云技术
    工程文档编写
  • 原文地址:https://www.cnblogs.com/MrYuChen-Blog/p/14803558.html
Copyright © 2020-2023  润新知