Giter Club home page Giter Club logo

light-task-scheduler's Introduction

LTS用户文档

LTS(light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。

---> 底部有招人帖

项目地址

github地址: https://github.com/ltsopensource/light-task-scheduler

oschina地址: http://git.oschina.net/hugui/light-task-scheduler

例子: https://github.com/ltsopensource/lts-examples

文档地址(正在更新中,后面以这个为准): https://www.gitbook.com/book/qq254963746/lts/details

这两个地址都会同步更新。感兴趣,请加QQ群:109500214 (加群密码: hello world)一起探讨、完善。越多人支持,就越有动力去更新,喜欢记得右上角star哈。

1.7.2-SNAPSHOT(master)变更主要点

  1. 优化JobContext中的BizLogger,由原来的去掉了threadlocal,解决taskTracker多线程的问题, 去掉LtsLoggerFactory.getLogger()用法

框架概况

LTS 有主要有以下四种节点:

  • JobClient:主要负责提交任务, 并接收任务执行反馈结果。
  • JobTracker:负责接收并分配任务,任务调度。
  • TaskTracker:负责执行任务,执行完反馈给JobTracker。
  • LTS-Admin:(管理后台)主要负责节点管理,任务队列管理,监控管理等。

其中JobClient,JobTracker,TaskTracker节点都是无状态的。 可以部署多个并动态的进行删减,来实现负载均衡,实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。

LTS注册中心提供多种实现(Zookeeper,redis等),注册中心进行节点信息暴露,master选举。(Mongo or Mysql)存储任务队列和任务执行日志, netty or mina做底层通信, 并提供多种序列化方式fastjson, hessian2, java等。

LTS支持任务类型:

  • 实时任务:提交了之后立即就要执行的任务。
  • 定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。
  • Cron任务:CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * * * ?

支持动态修改任务参数,任务执行时间等设置,支持后台动态添加任务,支持Cron任务暂停,支持手动停止正在执行的任务(有条件),支持任务的监控统计,支持各个节点的任务执行监控,JVM监控等等.

架构图

LTS architecture

概念说明

节点组

  1. 英文名称 NodeGroup,一个节点组等同于一个小的集群,同一个节点组中的各个节点是对等的,等效的,对外提供相同的服务。
  2. 每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。

FailStore

  1. 顾名思义,这个主要是用于失败了存储的,主要用于节点容错,当远程数据交互失败之后,存储在本地,等待远程通信恢复的时候,再将数据提交。
  2. FailStore主要用户JobClient的任务提交,TaskTracker的任务反馈,TaskTracker的业务日志传输的场景下。
  3. FailStore目前提供几种实现:leveldb,rocksdb,berkeleydb,mapdb,ltsdb,用于可以自由选择使用哪种,用户也可以采用SPI扩展使用自己的实现。

流程图

下图是一个标准的实时任务执行流程。

LTS progress

LTS-Admin新版界面预览

LTS Admin 目前后台带有由ztajy提供的一个简易的认证功能. 用户名密码在auth.cfg中,用户自行修改.

特性

1、Spring支持

LTS可以完全不用Spring框架,但是考虑到很用用户项目中都是用了Spring框架,所以LTS也提供了对Spring的支持,包括Xml和注解,引入lts-spring.jar即可。

2、业务日志记录器

在TaskTracker端提供了业务日志记录器,供应用程序使用,通过这个业务日志器,可以将业务日志提交到JobTracker,这些业务日志可以通过任务ID串联起来,可以在LTS-Admin中实时查看任务的执行进度。

3、SPI扩展支持

SPI扩展可以达到零侵入,只需要实现相应的接口,并实现即可被LTS使用,目前开放出来的扩展接口有

  1. 对任务队列的扩展,用户可以不选择使用mysql或者mongo作为队列存储,也可以自己实现。
  2. 对业务日志记录器的扩展,目前主要支持console,mysql,mongo,用户也可以通过扩展选择往其他地方输送日志。

4、故障转移

当正在执行任务的TaskTracker宕机之后,JobTracker会立马将分配在宕机的TaskTracker的所有任务再分配给其他正常的TaskTracker节点执行。

5、节点监控

可以对JobTracker,TaskTracker节点进行资源监控,任务监控等,可以实时的在LTS-Admin管理后台查看,进而进行合理的资源调配。

6、多样化任务执行结果支持

LTS框架提供四种执行结果支持,EXECUTE_SUCCESSEXECUTE_FAILEDEXECUTE_LATEREXECUTE_EXCEPTION,并对每种结果采取相应的处理机制,譬如重试。

  • EXECUTE_SUCCESS: 执行成功,这种情况,直接反馈客户端(如果任务被设置了要反馈给客户端)。
  • EXECUTE_FAILED:执行失败,这种情况,直接反馈给客户端,不进行重试。
  • EXECUTE_LATER:稍后执行(需要重试),这种情况,不反馈客户端,重试策略采用1min,2min,3min的策略,默认最大重试次数为10次,用户可以通过参数设置修改这个重试次数。
  • EXECUTE_EXCEPTION:执行异常, 这种情况也会重试(重试策略,同上)

7、FailStore容错

采用FailStore机制来进行节点容错,Fail And Store,不会因为远程通信的不稳定性而影响当前应用的运行。具体FailStore说明,请参考概念说明中的FailStore说明。

项目编译打包

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

用户使用一般分为两种:

1、Maven构建

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

2、直接Jar引用

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

JobTracker和LTS-Admin部署

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

  1. 运行根目录下的sh build.shbuild.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
  1. JobTracker启动。如果你想启动一个节点,直接修改下conf/zoo下的配置文件,然后运行 sh jobtracker.sh zoo start即可,如果你想启动两个JobTracker节点,那么你需要拷贝一份zoo,譬如命名为zoo2,修改下zoo2下的配置文件,然后运行sh jobtracker.sh zoo2 start即可。logs文件夹下生成jobtracker-zoo.out日志。
  2. LTS-Admin启动.修改conf/lts-monitor.cfgconf/lts-admin.cfg下的配置,然后运行bin下的sh lts-admin.shlts-admin.cmd脚本即可。logs文件夹下会生成lts-admin.out日志,启动成功在日志中会打印出访问地址,用户可以通过这个访问地址访问了。

JobClient(部署)使用

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

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);

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>

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();
    }
}

TaskTracker(部署使用)

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

定义自己的任务执行类

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, "执行成功了,哈哈");
    }
}

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();

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>

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();
    }
}

参数说明

参数说明

使用建议

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

一个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;
    }
}

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();
    }
}

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>

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的流量走外网网卡,那么需要在host中,把主机名称的映射地址改为外网网卡地址即可,内网同理。

关于节点标识问题

如果在节点启动的时候设置节点标识,LTS会默认设置一个UUID为节点标识,可读性会比较差,但是能保证每个节点的唯一性,如果用户能自己保证节点标识的唯一性,可以通过 setIdentity 来设置,譬如如果每个节点都是部署在一台机器(一个虚拟机)上,那么可以将identity设置为主机名称

SPI扩展说明

支持JobLogger,JobQueue等等的SPI扩展

LTS-Admin使用jetty启动(默认),不定期挂掉解决方案

issue#389

招人!!!

工作年限 三年以上

学历要求 本科

期望层级 P6(资深Java工程师)/P7(技术专家)

岗位描述

会员平台,负责阿里巴巴集团的用户体系,支持集团内各线业务线用户类需求,支持集团对外合作的用户通和业务通。 包括各个端的用户登录&授权、Session体系、注册、账户管理、账户安全等功能,底层的用户信息服务,会话和凭证管理等等,是集团最核心的产品线之一,每天承载千亿次调用量、峰值千万QPS、以及分布全球的混合云架构等等。

作为软件工程师,你将会在我们的核心产品上工作,这些产品为我们的商业基础设施提供关键功能, 取决于你的兴趣和经验,你可以在如下的一个或多个领域工作:全球化,用户体验,数据安全,机器学习,系统高可用性等等。

  1. 独立完成中小型项目的系统分析、设计,并主导完成详细设计和编码的任务,确保项目的进度和质量;
  2. 能够在团队中完成code review的任务,确保相关代码的有效性和正确性,并能够通过code review提供相关性能以及稳定性的建议;
  3. 参与建设通用、灵活、智能的业务支撑平台,支撑上层多场景的复杂业务。 岗位要求
  4. 扎实的java编程基础,熟悉常用的Java开源框架;
  5. 具有基于数据库、缓存、分布式存储开发高性能、高可用数据应用的实际经验,熟练掌握LINUX操作系统;
  6. 具备良好的识别和设计通用框架及模块的能力;
  7. 热爱技术,工作认真、严谨,对系统质量有近乎苛刻的要求意识,善于沟通与团队协作;
  8. 具备大型电子商务网站或金融行业核心系统开发、设计工作经验者优先;
  9. 具备大数据处理、算法、机器学习类工作经验优先。 感兴趣,可以发简历到 [email protected] 欢迎投递

light-task-scheduler's People

Contributors

carlvine500 avatar hongliangpan avatar irector2016 avatar laudukang avatar leochans avatar lstoars avatar lusong1986 avatar qq254963746 avatar qunzer avatar sevenday2014 avatar xionghan00 avatar yangfeiran avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

light-task-scheduler's Issues

JobTracker集群时差导致Cron任务重复触发

版本 1.6.9
JobTracker个数:2
任务类型:Cron-依赖上一周期

当前逻辑:
当TaskTracker完成任务后,随机选择一个JobTracker返回JobRunResult,JobTracker会根据当前服务器时间产生下一次触发任务。

场景:
假设JobTracker-1在 10:00(JobTracker-1的服务器时间)分发cron任务,task-tracker迅速完成任务并返回至JobTracker-2,而此时JobTracker-2的服务器时间为09:59。这样JobTracker-2计算出的下一个触发时间点依然是10:00,那么该cron任务在10:00时间点会被触发多次。

这个问题是否有办法规避?或者属于bug,需要修复?

能否考虑增加分片的支持

@qq254963746, 能否考虑引入分片的支持。JOB调度处理中若遇到数据量比较大的场景,分片是需要考虑的,当当的elastic-job有这样明确的JOB来引入分片支持(但感觉不是很完善)。从任务处理的成熟度而言,spring batch提供了比较多的选择(但有时候,你需要依赖该框架才能实现JOB处理数据量比较大的场景——相应的elastic-job就没有那么完善)。light-task-scheduler会引入相关的治理方式麽(或者有其他集成的解决方案)

StackOverflowException caused by MStatReportWorker collect failed.

2016-07-10 00:00:00[LTS-Monitor-data-collector-thread-1:286184274]-[ERROR]         [LTS]MStatReportWorker collect failed., lts version: 1.6.8, current host: 192.168.111.112
java.lang.StackOverflowError
at java.util.ArrayList$SubList.add(ArrayList.java:1047)
at java.util.ArrayList$SubList.add(ArrayList.java:1047)
    .... 

ArrayList size > 3000000

jobAdd.vm

$(window.frames["cronGeneratorIframe"]).contents().find("#cron").val(cron);
$(window.frames["cronGeneratorIframe"]).contents().find("#btnFan").click();
应该改成,解决ie兼容
$(window.frames["cronGeneratorIframe"].document).find("#cron").val(cron);
$(window.frames["cronGeneratorIframe"].document).find("#btnFan").click();

replaceOnExist参数

如果多实例中每个实例都有任务,replaceOnExist=true是不是意味着任务只有一个实例的任务会执行;反之,如果是false,就是每个实例的任务都会执行一次?

JSONArray bug

com.github.ltsopensource.json.JSONArray#JSONArray(Object array)

if (array.getClass().isArray()) { //omitted... } //此处应该加个else-> else //<- if (Collection.class.isAssignableFrom(array.getClass())) { //omitted... } else { //omitted... }

JobQueueApi.addJob bug

com.lts.admin.web.api.JobQueueApi.addJob(JobQueueApi.java:253)
这行代码有bug,在通过webui添加非repeat job时,repeatcount(Integer类型)默认是null,导致setRepeatCount报NullPointException.

支持夏令时吗?

服务运行在美西环境,会有夏令时的概念,不知道是不是可以支持?另外,可以指定时区的执行吗?

2台服务器一个启动Tracker 一个启动lts-admin为啥前者回去请求后者的ip?

一台启动的JobTracker,TaskTracker,JobClient, 一台启动了lts-admin,
2台阿里云服务器,但是2台内网是不通的.

为啥安装了JobTracker,TaskTracker,JobClient的服务器A(数据库在这个服务器上)会去请求lts-admin的服务器B

异常: [2017-02-10 14:05:03.110]
[LTS-Monitor-data-collector-thread-1][WARN][MStatReportWorker] [LTS]
Report Monitor Data Failed: POST ERROR: url=http://10.xx.xx.233:8730/MO_10.xx.xx.233_31606_10-47-53.689_1/monitor_data_add_cmd, errorMsg=connect timed out, lts version: 1.6.9, current host: 10.xx.xx.220

上面日志显示的是阿里云内网ip地址,为啥,A服务器回去请求B服务器(lts-admin) ?

我想问一些问题

这个系统和quartz比有什么特色?
我知道quartz支持

  • 单机
  • 分布式
  • misfire情况下的重新调度

调度健壮性方面做得如何?

有压测数据么?

想在公司推LTS,需要写压测结果数据,不知道是否有相关数据呢?

是否支持暂停接受任务?

比如在分布式中,任务执行器需要做改造,但是不能停止该JVM因为有其它事情在做,所以能否向dubbo那样实现一个暂停当前实例的操作?不知道我的语言组织对不对,反正就是那个意思。

添加任务的疑问?

添加任务的时候,不需要把任务对应的Jar包一起上传吗?lts是如何启动一个任务的呢?

lts-spring

在和Spring quartz集成的时候,spring quartz的任务需要单独的创建task_tracker,jobClient(完成后关闭),这样就就导致一个JVM中,有两个task_tracker(一个quartz,一个自己业务逻辑的),这种情况是否可以改善一下。如果公用同样的配置,就会导致jobRunner不匹配的问题。

实际使用中,JobDispatcher肯定是常用的,但是,和quartz的集成又多了一个“QuartzJobRunnerDispatcher”,两者的实现,明显相似,但却不一致。

是否可以借鉴,mq中的routing key的概念,根据key路由到对应的消费者(jobrunner),这样就统一了,不会导致到处都是jobRunner

admin war 启动的时候需要commons-lang jar

简单试用了下,很棒的项目。有个小问题:通过lts-admin.cmd启动admin的时候,log报错缺少commons-lang包,是由于spring初始化velocityConfig bean的时候需要它。

一个TaskTracker执行多种任务注入问题

JOB_RUNNER_MAP.put("aType", new JobRunnerA()); // 也可以从Spring中拿
JOB_RUNNER_MAP.put("bType", new JobRunnerB());
实现多任务后,子JobRunnerA里面spring依赖注入会一直为空,求方法?

在多点执行时候,mysql的lts_job_po锁表

在多点执行时候,mysql的lts_job_po表,频繁被锁。

*** (1) TRANSACTION:
TRANSACTION 118358, ACTIVE 27 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1184, 2 row lock(s)
MySQL thread id 1785, OS thread handle 0x7f6079fff700, query id 54384 xxx.com 192.168.237.214 bjs Sending data
SELECT * FROM `lts_job_po`  WHERE `task_tracker_node_group` = 'test_trade_TaskTracker'  AND is_running = 0  AND `trigger_time` < 1433224860874  ORDER BY `trigger_time` ASC, `priority` ASC, `gmt_created` ASC  LIMIT 0, 1 FOR UPDATE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 608 page no 10 n bits 88 index `PRIMARY` of table `bjs`.`lts_job_po` trx table locks 1 total table locks 4  trx id 118358 lock_mode X locks rec but not gap waiting lock hold time 0 wait time before grant 0 
*** (2) TRANSACTION:
TRANSACTION 118703, ACTIVE 2 sec updating or deleting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 1
MySQL thread id 1364, OS thread handle 0x7f6077bff700, query id 55023 xxx.com 192.168.237.214 bjs updating
UPDATE `lts_job_po` SET is_running = 0, gmt_modified = 1433224865235 , trigger_time = 1433228400000 WHERE job_id = '2389F6E0069111E5AAB8000C29AB3968'
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 608 page no 10 n bits 88 index `PRIMARY` of table `bjs`.`lts_job_po` trx table locks 1 total table locks 4  trx id 118703 lock_mode X locks rec but not gap lock hold time 2 wait time before grant 2 
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 608 page no 7 n bits 144 index `idx_triggerTime_priority_gmtCreated` of table `bjs`.`lts_job_po` trx table locks 1 total table locks 4  trx id 118703 lock_mode X locks rec but not gap waiting lock hold time 0 wait time before grant 0 
*** WE ROLL BACK TRANSACTION (1)

LZ 搞个微信群啊

小白大概看了下 感觉还不错 准备撸下代码 LZ 微信群搞起啊 这年代 QQ早就不用了

lts的cpu、内存监控问题

昨天在windowns环境做1.6.5版本测试时,发现控制台打印了很多cpu超过90%的日志,tasktracker就暂停从jobtracker拉任务了,导致任务不执行,但同时在资源管理器中看cpu利用率,并没有超过90%,请问这是咋回事,或者cpu、内存等的监控是否可以手动配置开启与否,谢谢。
image

访问执行中的任务报错。

Caused by: java.sql.SQLException: Table 'lts.lts_wjq_test_trade_TaskTracker' doesn't exist Query: SELECT count(1) FROM lts_wjq_test_trade_TaskTracker WHERE task_tracker_node_group = ? Parameters: [test_trade_TaskTracker]
at com.github.ltsopensource.store.jdbc.dbutils.DbRunner.rethrow(DbRunner.java:231)
at com.github.ltsopensource.store.jdbc.dbutils.DbRunner.query(DbRunner.java:131)
at com.github.ltsopensource.store.jdbc.dbutils.DbRunner.query(DbRunner.java:97)
at com.github.ltsopensource.store.jdbc.SqlTemplateImpl.query(SqlTemplateImpl.java:100)
at com.github.ltsopensource.store.jdbc.SqlTemplateImpl$3.run(SqlTemplateImpl.java:94)
at com.github.ltsopensource.store.jdbc.SqlTemplateImpl.execute(SqlTemplateImpl.java:30)
at com.github.ltsopensource.store.jdbc.SqlTemplateImpl.query(SqlTemplateImpl.java:91)
at com.github.ltsopensource.store.jdbc.SqlTemplateImpl.queryForValue(SqlTemplateImpl.java:104)
at com.github.ltsopensource.store.jdbc.builder.SelectSql.single(SelectSql.java:271)

lts升级问题

您好,能否提供一下lts升级(如从1.6.3升级到1.6.5版本)文档,特别是表结构的升级,不知道新版本都改了哪些字段、新增了哪些字段,还有配置等方面,谢谢。

JobClient的回调丢失

JobClient的回调不是很稳定,经常会遇到任务运行完成,表lts_job_log_po可以查到任务已完成,但是没有触发回掉,请问是我配置问题还是……

无法启动JobTrancker

├── 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
│   ├── commons-pool2-2.3.jar
│   ├── curator-client-2.9.1.jar
│   ├── curator-framework-2.9.1.jar
│   ├── curator-recipes-2.9.1.jar
│   ├── druid-1.0.14.jar
│   ├── fastjson-1.2.7.jar
│   ├── guava-16.0.1.jar
│   ├── hessian-4.0.38.jar
│   ├── jackson-annotations-2.6.0.jar
│   ├── jackson-core-2.6.3.jar
│   ├── jackson-databind-2.6.3.jar
│   ├── javassist-3.20.0-GA.jar
│   ├── je-5.0.73.jar
│   ├── jedis-2.7.3.jar
│   ├── jline-0.9.94.jar
│   ├── leveldbjni-all-1.8.jar
│   ├── log4j-1.2.16.jar
│   ├── lts-core-1.7.0-SNAPSHOT.jar
│   ├── lts-jobtracker-1.7.0-SNAPSHOT.jar
│   ├── lts-monitor-1.7.0-SNAPSHOT.jar
│   ├── lts-spring-1.7.0-SNAPSHOT.jar
│   ├── lts-startup-1.7.0-SNAPSHOT.jar
│   ├── lts-tasktracker-1.7.0-SNAPSHOT.jar
│   ├── mapdb-2.0-beta10.jar
│   ├── mina-core-2.0.9.jar
│   ├── mongo-java-driver-3.0.2.jar
│   ├── morphia-1.0.0-rc1.jar
│   ├── mysql-connector-java-5.1.26.jar
│   ├── netty-all-4.0.20.Final.jar
│   ├── rocksdbjni-3.10.1.jar
│   ├── slf4j-api-1.7.5.jar
│   ├── slf4j-log4j12-1.7.5.jar
│   ├── zkclient-0.1.jar
│   └── zookeeper-3.4.5.jar
└── war
├── jetty
│   └── lib
│   ├── jetty-6.1.26.jar
│   ├── jetty-util-6.1.26.jar
│   ├── lts-startup-1.7.0-SNAPSHOT.jar
│   └── servlet-api-2.5-20081211.jar
└── lts-admin.war

[root@localhost lts]# pwd
/usr/local/lts
[root@localhost lts]# ./bin/jobtracker.sh zoo start
: 没有那个文件或目录

有关于Cron表达式的问题

您好,

我看到可以手动写Cron表达式,而不使用前端的点击插件进行Cron表达式构造。但是感觉和Cron4j的表达式定义不一样啊,看了下源码里面,一共支持7个位置的定义,cron4j支持5个位置。除了这个以外:
protected static final int SECOND = 0;
protected static final int MINUTE = 1;
protected static final int HOUR = 2;
protected static final int DAY_OF_MONTH = 3;
protected static final int MONTH = 4;
protected static final int DAY_OF_WEEK = 5;
protected static final int YEAR = 6;
请问各个位置的要求是什么啊?
每个位置都要填写么?

任务过滤ip或者限定ip

当多个服务器运行时,希望可以给某一个任务添加固定ip运行,或者过滤某ip运行,,,因为有时候需求,希望某一个定时任务只在固定的服务器上运行,,,

希望能支持能启动多个tasktracker,但是jobtracker只派送任务给第一启动的tasktracker

这个参数lts.tasktracker.dispatch-runner.enable是如何使用的??在lts-example-quartz工程的lts.properties出现过,但被注释掉了。

因为有场景是针对一种job只在一个节点运行的场景,比如在开发环境,各个开发人员都各自启动了相同的tasktracker,但是jobtracker在派送任务时,检查一个参数(比方lts.tasktracker.dispatch-runner.sigletone),如果为true,则只给第一个启动的tasktracker分配任务。

LTS使用时遇到的问题

我在使用LTS的过程中遇到了这样一个问题,JobClient使用testProtector的运行方式,定时产生任务数据。但是在每次定时执行时,系统的线程数就会增大,并且累加。最后线程数超过系统最大值,就报出OutOfMemoryError错误。看起来像是线程泄漏,但是也没有找到出现问题的原因。
以下是我的JobClient代码:
2
3
4

以下是JobClient报出的错误信息:
p1

JobTrackerStartup运行报错

com.github.ltsopensource.startup.jobtracker.JobTrackerStartup
String confPath = args[0];

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at com.github.ltsopensource.startup.jobtracker.JobTrackerStartup.main(JobTrackerStartup.java:17)

TaskTrackerStartup运行也报这个错

linux 启动

RT:linux 启动命令异常:
[root@localhost lts-1.7.0-SNAPSHOT-bin]# ./bin/lts-admin.sh
: 没有那个文件或目录
[root@localhost lts-1.7.0-SNAPSHOT-bin]# ./bin/lts-admin.sh start
: 没有那个文件或目录
[root@localhost lts-1.7.0-SNAPSHOT-bin]# cd bin
[root@localhost bin]# ./lts-admin.sh start
: 没有那个文件或目录
[root@localhost bin]# sh lts-admin.sh start
: command not found2:
: command not found5:
: 没有那个文件或目录: cd: .
: command not found9:
'ts-admin.sh: line 18: syntax error near unexpected token do 'ts-admin.sh: line 18:do
[root@localhost bin]#

[root@localhost bin]# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@localhost bin]#

├── bin
│   ├── jobtracker.cmd
│   ├── jobtracker.sh
│   ├── lts-admin.cmd
│   ├── lts-admin.sh
│   ├── lts-monitor.cmd
│   ├── lts-monitor.sh
│   └── tasktracker.sh
├── conf
│   ├── all580
│   │   ├── jobtracker.cfg
│   │   ├── log4j.properties
│   │   └── lts-monitor.cfg
│   ├── log4j.properties
│   ├── lts-admin.cfg
│   ├── lts-monitor.cfg
│   ├── readme.txt
│   └── tasktracker.cfg
├── lib
│   ├── commons-pool2-2.3.jar
│   ├── curator-client-2.9.1.jar
│   ├── curator-framework-2.9.1.jar
│   ├── curator-recipes-2.9.1.jar
│   ├── druid-1.0.14.jar
│   ├── fastjson-1.2.7.jar
│   ├── guava-16.0.1.jar
│   ├── hessian-4.0.38.jar
│   ├── jackson-annotations-2.6.0.jar
│   ├── jackson-core-2.6.3.jar
│   ├── jackson-databind-2.6.3.jar
│   ├── javassist-3.20.0-GA.jar
│   ├── je-5.0.73.jar
│   ├── jedis-2.7.3.jar
│   ├── jline-0.9.94.jar
│   ├── leveldbjni-all-1.8.jar
│   ├── log4j-1.2.16.jar
│   ├── lts-core-1.7.0-SNAPSHOT.jar
│   ├── lts-jobtracker-1.7.0-SNAPSHOT.jar
│   ├── lts-monitor-1.7.0-SNAPSHOT.jar
│   ├── lts-spring-1.7.0-SNAPSHOT.jar
│   ├── lts-startup-1.7.0-SNAPSHOT.jar
│   ├── lts-tasktracker-1.7.0-SNAPSHOT.jar
│   ├── mapdb-2.0-beta10.jar
│   ├── mina-core-2.0.9.jar
│   ├── mongo-java-driver-3.0.2.jar
│   ├── morphia-1.0.0-rc1.jar
│   ├── mysql-connector-java-5.1.26.jar
│   ├── netty-all-4.0.20.Final.jar
│   ├── rocksdbjni-3.10.1.jar
│   ├── slf4j-api-1.7.5.jar
│   ├── slf4j-log4j12-1.7.5.jar
│   ├── zkclient-0.1.jar
│   └── zookeeper-3.4.5.jar
├── logs
└── war
├── jetty
│   └── lib
│   ├── jetty-6.1.26.jar
│   ├── jetty-util-6.1.26.jar
│   ├── lts-startup-1.7.0-SNAPSHOT.jar
│   └── servlet-api-2.5-20081211.jar
└── lts-admin.war

求解决。。。求回复

使用Maven pakage后 java -jar 运行报错

报错信息如下所示,找不到 mysql logger的 扩展,我知道lts-logger下有一个子模块叫 lts-logger-mysql,最初以为是该模块没有在lts-example上配置依赖,后来查看一下jar包,里面确实有该模块的class文件。另外,在eclipse和IDEA中编译运行没问题,但使用maven打包成jar后 java -jar 就不行(打包时已经将所有依赖都打进jar包),报错信息如下:

[ERROR] [09:28:38] com.lts.core.cluster.JobNode - [LTS] Start failed!, lts version: 1.5-SNAPSHOT-jar-with-dependencies, current host: 10.37.129.2
java.lang.IllegalStateException: No such extension com.lts.biz.logger.JobLoggerFactory by name mysql
at com.lts.core.extension.ExtensionLoader.findException(ExtensionLoader.java:304)
at com.lts.core.extension.ExtensionLoader.createExtension(ExtensionLoader.java:315)
at com.lts.core.extension.ExtensionLoader.getExtension(ExtensionLoader.java:175)
at com.lts.biz.logger.JobLoggerFactory$Adpative.getJobLogger(JobLoggerFactory$Adpative.java)
at com.lts.jobtracker.JobTracker.innerStart(JobTracker.java:47)
at com.lts.core.cluster.AbstractJobNode.start(AbstractJobNode.java:52)
at com.lts.example.api.JobTrackerTest.testMysqlQueue(JobTrackerTest.java:84)
at com.lts.example.api.JobTrackerTest.main(JobTrackerTest.java:17)
[ERROR] [09:28:40] com.lts.core.cluster.JobNode - [LTS] Stop failed!, lts version: 1.5-SNAPSHOT-jar-with-dependencies, current host: 10.37.129.2
java.lang.NullPointerException
at com.lts.core.cluster.AbstractJobNode.stop(AbstractJobNode.java:69)
at com.lts.example.api.JobTrackerTest$2.run(JobTrackerTest.java:89)
at java.lang.Thread.run(Thread.java:745)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.