elastic-job 的简单使用
?
說明:這個(gè)是使用2.1.5版本
elastic-job是當(dāng)當(dāng)開源的的的定時(shí)任務(wù),使用也是很簡單的,可以解決數(shù)據(jù)量的大的時(shí)候可以分片執(zhí)行,多應(yīng)用節(jié)點(diǎn)部署時(shí)候不會(huì)重復(fù)執(zhí)行。
是通過zookeeper作為控制中心,進(jìn)行任務(wù)分配。
?
使用手冊:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
分片原理:https://www.cnblogs.com/haoxinyue/p/6919375.html
?
一. 安裝elastic-job控制臺(tái)
下載源碼:https://github.com/elasticjob/elastic-job-lite
(1) 找到elastic-job-lite 下面的elastic-job-lite-console,然后在這個(gè)文件下執(zhí)行mvn打包??
mvn?clean?install?-Dmaven.test.skip=true??(2)得到elastic-job-lite-console-2.1.5.tar.gz。并上傳到linux服務(wù)器下,并且解壓,
在bin文件夾下執(zhí)行nohup ./start.sh & (-p 可以指定端口號(hào))?,端口是8899?,瀏覽器打開:ip:8899就可以訪問控制臺(tái)了,如下圖:
? ? ? ?
?已經(jīng)配置過注冊中心的界面
?
二, zookeeper安裝
? ? 參考:
https://blog.csdn.net/m290345792/article/details/52576890
https://www.cnblogs.com/wangmingshun/p/7745808.html
?
三,實(shí)現(xiàn)job
(1)使用maven 引入jar包
<!-- 當(dāng)當(dāng)job--> <dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version> </dependency> <dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-spring</artifactId><version>2.1.5</version> </dependency> <!-- 當(dāng)當(dāng)job-->(2)編寫一個(gè)測試job
job功能要 實(shí)現(xiàn)SimpleJob這個(gè)類,然后重寫execute方法,在這個(gè)方法中編寫job的業(yè)務(wù)邏輯,例如
public class SimpleJobDemo2 implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {System.out.println(String.format("------Thread ID: %s, 任務(wù)總片數(shù): %s, 當(dāng)前分片項(xiàng): %s",Thread.currentThread().getId(), shardingContext.getShardingTotalCount(), shardingContext.getShardingItem()));/*** 實(shí)際開發(fā)中,有了任務(wù)總片數(shù)和當(dāng)前分片項(xiàng),查詢選擇數(shù)據(jù)進(jìn)行執(zhí)行* */} }?
例如分片執(zhí)行的:
public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0: // do something by sharding item 0break;case 1: // do something by sharding item 1break;case 2: // do something by sharding item 2break;// case n: ... }} }?
?
?
?(3) Spring 配置(更多配置參數(shù)請(qǐng)參考 使用手冊)
//數(shù)據(jù)庫jndi配置,執(zhí)行job 的時(shí)候會(huì)插入表,并且生成執(zhí)行記 <bean id="elasticJobLog" class=""org.springframeork.jndi.JndiObjectFactoryBean"><property name="jniName"><value>${db.jndiName}</value></property> </bean><!--配置作業(yè)注冊中心 --> /** * server-lists : 連接Zookeeper服務(wù)器的列表 包括IP地址和端口號(hào) 多個(gè)地址用逗號(hào)分隔 如: host1:2181,host2:2181 * namespace :Zookeeper的命名空間 * base-sleep-time-milliseconds: 等待重試的間隔時(shí)間的初始值 單位:毫秒 * max-sleep-time-milliseconds: 等待重試的間隔時(shí)間的最大值 單位:毫秒 * max-retries : 最大嘗試次數(shù) * **/ <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" /><!-- 配置作業(yè) 測試使用--> /** * id: 任務(wù)的唯一標(biāo)示 * event-trace-rdb-data-source : job要操作的數(shù)據(jù)庫(可以不設(shè)置) * class:job 所在的位置 * registry-center-ref : 要指定的注冊中心* cron : job 觸發(fā)的cron表達(dá)式
* sharding-total-count : 作業(yè)分片總數(shù)
* sharding-item-parameters :分片序列號(hào)和參數(shù)用等號(hào)分隔,多個(gè)鍵值對(duì)用逗號(hào)分隔 分片序列號(hào)從0開始,不可大于或等于作業(yè)分片總數(shù) 如: 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)啟動(dòng)程序,就可以在之前部署的控制臺(tái)看到j(luò)ob狀態(tài)
登錄的賬號(hào)密碼在打包的配置文件里,登錄后配置注冊中心? 就可以在頁面中看到j(luò)ob了
?
四,job執(zhí)行說明:
1. 如果分片數(shù)是1??sharding-total-count = "1" zookeeper注冊中心會(huì)在多臺(tái)服務(wù)器中隨機(jī)選擇一臺(tái)執(zhí)行,如果不是1,則會(huì)根據(jù)分片策略執(zhí)行。參考:分片原理
? ? 2.? 注冊中心可以有多臺(tái),但是都是以單數(shù)的形式(1,3,5),因?yàn)閦ookeeper 是一主多從,主的宕機(jī),會(huì)使用選舉的形式再次確定哪個(gè)是主,哪些是從。
3. 如果設(shè)置了數(shù)據(jù)庫的jndi,并且設(shè)置了?event-trace-rdb-data-source 的值,job運(yùn)行的時(shí)候會(huì)在數(shù)據(jù)庫的?OB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG兩張表中生成執(zhí)行記錄,不設(shè)置也不影響job的正常運(yùn)行 ,例如:
?
五,問題記錄
? (1)zookeeper安裝啟動(dòng)問題:
啟動(dòng)會(huì)遇到問題,例如找不到j(luò)dk,具體原因在安裝目錄 bin/zookeeper.out文件中查找,找到問題并解決后在啟動(dòng)
(2) 關(guān)閉應(yīng)用的程序的時(shí)候,tomcat 進(jìn)程還在
tomcat(sh shutdown.sh) 關(guān)閉的時(shí)候,項(xiàng)目不能徹底停掉,進(jìn)程還在:是因?yàn)殛P(guān)閉的時(shí)候servlet容器發(fā)現(xiàn)job還有線程存在,所以不能徹底關(guān)閉
解決辦法:增加一個(gè)監(jiān)聽,在contextDestroyed 方法中你用elastic-job的shutdown方法
//新建一個(gè)類實(shí)現(xiàn)ServletContextListener用于關(guān)閉elasticJob的線程 @WebListener public class JobServletContextListener implements ServletContextListener {private static Logger logger = LoggerFactory.getLogger(JobServletContextListener.class);@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {}@Overridepublic 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("發(fā)現(xiàn)dangdang定時(shí)任務(wù)beanName: "+beanName);SpringJobScheduler scheduler = (SpringJobScheduler)context.getBean(beanName);scheduler.getSchedulerFacade().shutdownInstance();}}} catch (Exception e) {logger.error("Error Destroying Context", e);}} }?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/sunjiguang/p/9273871.html
總結(jié)
以上是生活随笔為你收集整理的elastic-job 的简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于测试url传值的问题
- 下一篇: SpringBoot笔记(二)