说明:这个是使用2.1.5版本

  elastic-job是当当开源的的的定时任务,使用也是很简单的,可以解决数据量的大的时候可以分片执行,多应用节点部署时候不会重复执行。

  是通过zookeeper作为控制中心,进行任务分配。

使用手册:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/

分片原理:https://www.cnblogs.com/haoxinyue/p/6919375.html

一. 安装elastic-job控制台

  下载源码:https://github.com/elasticjob/elastic-job-lite

  (1) 找到elastic-job-lite 下面的elastic-job-lite-console,然后在这个文件下执行mvn打包

mvn clean install -Dmaven.test.skip=true  

  (2)得到elastic-job-lite-console-2.1.5.tar.gz。并上传到linux服务器下,并且解压,

在bin文件夹下执行nohup ./start.sh & (-p 可以指定端口号) ,端口是8899 ,浏览器打开:ip:8899就可以访问控制台了,如下图:

  

   

已经配置过注册中心的界面

   

二, zookeeper安装

参考:

    https://blog.csdn.net/m290345792/article/details/52576890

    https://www.cnblogs.com/wangmingshun/p/7745808.html

三,实现job

  (1)使用maven 引入jar包

<!-- 当当job-->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.</version>
</dependency>
<!-- 当当job-->

  (2)编写一个测试job

  job功能要 实现SimpleJob这个类,然后重写execute方法,在这个方法中编写job的业务逻辑,例如

public class SimpleJobDemo2 implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println(String.format("------Thread ID: %s, 任务总片数: %s, 当前分片项: %s",
Thread.currentThread().getId(), shardingContext.getShardingTotalCount(), shardingContext.getShardingItem()));
/**
* 实际开发中,有了任务总片数和当前分片项,查询选择数据进行执行
*
*/
}
}

  例如分片执行的:

public class MyElasticJob implements SimpleJob {

    @Override
public void execute(ShardingContext context) {
switch (context.getShardingItem()) {
case 0:
// do something by sharding item 0
break;
case 1:
// do something by sharding item 1
break;
case 2:
// do something by sharding item 2
break;
// case n: ...
}
}
}

(3) Spring 配置(更多配置参数请参考 使用手册)  

//数据库jndi配置,执行job 的时候会插入表,并且生成执行记
<bean id="elasticJobLog" class=""org.springframeork.jndi.JndiObjectFactoryBean">
  <property name="jniName">
    <value>${db.jndiName}</value>
  </property>
</bean> <!--配置作业注册中心 -->
/**
* server-lists : 连接Zookeeper服务器的列表 包括IP地址和端口号 多个地址用逗号分隔 如: host1:2181,host2:2181
* namespace :Zookeeper的命名空间
* base-sleep-time-milliseconds: 等待重试的间隔时间的初始值 单位:毫秒
* max-sleep-time-milliseconds: 等待重试的间隔时间的最大值 单位:毫秒
* max-retries : 最大尝试次数
*
**/
<reg:zookeeper id="regCenter" server-lists="XXX.XXX.XXX.X:2181" namespace="hmap-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" /> <!-- 配置作业 测试使用-->
/**
* id: 任务的唯一标示
* event-trace-rdb-data-source : job要操作的数据库(可以不设置)
* class:job 所在的位置
* registry-center-ref : 要指定的注册中心
* cron : job 触发的cron表达式
* sharding-total-count : 作业分片总数
* sharding-item-parameters :分片序列号和参数用等号分隔,多个键值对用逗号分隔 分片序列号从0开始,不可大于或等于作业分片总数 如: 0=A,1=B
**/ <job:simple id="simpleJobDemo2" event-trace-rdb-data-source="elasticJobLog" class="hmap.assist.elasticJob.SimpleJobDemo2" registry-center-ref="regCenter" cron="0/2 * * * * ?" sharding-total-count="2" sharding-item-parameters="0=A,1=B" />

  (4)启动程序,就可以在之前部署的控制台看到job状态

    登录的账号密码在打包的配置文件里,登录后配置注册中心  就可以在页面中看到job了

    

四,job执行说明:

  1. 如果分片数是1  sharding-total-count = "1" zookeeper注册中心会在多台服务器中随机选择一台执行,如果不是1,则会根据分片策略执行。参考:分片原理

   2.  注册中心可以有多台,但是都是以单数的形式(1,3,5),因为zookeeper 是一主多从,主的宕机,会使用选举的形式再次确定哪个是主,哪些是从。

  3. 如果设置了数据库的jndi,并且设置了 event-trace-rdb-data-source 的值,job运行的时候会在数据库的 OB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG两张表中生成执行记录,不设置也不影响job的正常运行 ,例如:

  

五,问题记录

  (1)zookeeper安装启动问题:

  启动会遇到问题,例如找不到jdk,具体原因在安装目录 bin/zookeeper.out文件中查找,找到问题并解决后在启动

  (2) 关闭应用的程序的时候,tomcat 进程还在

  tomcat(sh shutdown.sh) 关闭的时候,项目不能彻底停掉,进程还在:是因为关闭的时候servlet容器发现job还有线程存在,所以不能彻底关闭

  解决办法:增加一个监听,在contextDestroyed 方法中你用elastic-job的shutdown方法

//新建一个类实现ServletContextListener用于关闭elasticJob的线程
@WebListener
public class JobServletContextListener implements ServletContextListener { private static Logger logger = LoggerFactory.getLogger(JobServletContextListener.class); @Override
public void contextInitialized(ServletContextEvent servletContextEvent) { } @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
logger.info("Destroying Context...");
try {
WebApplicationContext context = (WebApplicationContext) servletContextEvent.getServletContext().getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); String[] beanNames = context.getBeanDefinitionNames(); for(String beanName:beanNames)
{
if(beanName.contains("dangdang")&&beanName.contains("SpringJobScheduler")){
logger.info("发现dangdang定时任务beanName: "+beanName);
SpringJobScheduler scheduler = (SpringJobScheduler)context.getBean(beanName);
scheduler.getSchedulerFacade().shutdownInstance();
}
}
} catch (Exception e) {
logger.error("Error Destroying Context", e);
} }
}


elastic-job 的简单使用的更多相关文章

  1. elastic mapping not_analyzed 简单理解 + analysis-ik分词器安装

    1.索引index ,这个参数可以控制字段应该怎样建索引,怎样查询.它有以下三个可用值: not_analyzed:将字段的原始值放入索引中,作为一个独立的term,它是除string字段以外的所有字 ...

  2. 自学elastic search

    工作也有一段时间了,虽然来这个公司之后学会了几门不同的语言,但想拨尖还是任重道远. 想往高级程序员甚至是架构师方向发展.他仍然是我的学习对象.我现在做着的,无非是他玩剩下的罢了. luncene之前有 ...

  3. Elastic Static初识(01)

    写在前面 Elastic Static 是指由Elasticsearch,Logstash,Kibana,Beats等组件结合起来而构成的一个数据收集,分析,可视化的一个架构.我们经常听说过的ELK就 ...

  4. ElasticSearch实战-入门

    http://www.cnblogs.com/smartloli/ 1.概述 今天接着<ElasticSearch实战-日志监控平台>一文来给大家分享后续的学习,在<ElasticS ...

  5. 一些 CSS 框架

    利用 CSS 框架,可以简化你的工作,提高工作效率.CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块.下面给你推荐了27款优秀的CSS框 ...

  6. ElasticSearch实战

    ElasticSearch实战-入门 1.概述 今天接着<ElasticSearch实战-日志监控平台>一文来给大家分享后续的学习,在<ElasticSearch实战-日志监控平台& ...

  7. elasticSearch学习安装

    资料: 1.Elasticsearch学习,请先看这一篇! https://blog.csdn.net/laoyang360/article/details/52244917 2. linux下ela ...

  8. css框架,一把锋利的剑

    CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块,用于简化web前端开发的工作,提高工作效率. 产生原因 互联网行业已经发展了多年,浏览 ...

  9. 27款经典的CSS框架

    利用 CSS 框架,可以简化你的工作,提高工作效率.CSS 框架是一系列 CSS 文件的集合体,包含了基本的元素重置,页面排版.网格布局.表单样式.通用规则等代码块.下面给你推荐了27款优秀的CSS框 ...

  10. elastic job简单用法

    public class JobMain { //配置注册中心 private ZookeeperConfiguration zkConfig = new ZookeeperConfiguration ...

随机推荐

  1. Maximum Product Subarray(最大连续乘积子序列)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. android_handler(二)

    这篇记录 android 消息机制中.WorkThread 模拟向网络訪问数据,获得数据后,返回 message 发送给 MainThread ,并改动 TextView 的 text 的这种一个步骤 ...

  3. Django学习系列之重写User模型和登录验证

    重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...

  4. label显示不同颜色的字体

    NSString *contentSrt = [NSString stringWithFormat:@"%@ (%@)",categoryModel.categoryName, c ...

  5. Android网络爬虫程序(基于Jsoup)

    摘要:基于 Jsoup 实现一个 Android 的网络爬虫程序,抓取网页的内容并显示出来.写这个程序的主要目的是抓取海投网的宣讲会信息(公司.时间.地点)并在移动端显示,这样就可以随时随地的浏览在学 ...

  6. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程 ...

  7. HDU 5324 Boring Class【cdq分治】

    这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ...

  8. [办公自动化]计算机突然死机后asd自动恢复文档未能恢复,如何打开使用

    今天计算机突然死机,但是word未能提示自动恢复窗格.所以无法自动恢复word文档.但是在文档所在的文件夹看到了一个“自动恢复”开头的asd恢复文档. 该如何使用这个文档呢? 按照以前的惯例,尝试了如 ...

  9. 【bzoj3609】[Heoi2014]人人尽说江南好

    可以算出合并多少次. #include<algorithm> #include<iostream> #include<cstdlib> #include<cs ...

  10. JavaScript全局属性/函数

    JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...