前言
快速掌握基於spring框架整合Elastic-Job框架
Spring的schema整合Simple
- 創建maven+spring項目
- 導入依賴jar包
<?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.zcw</groupId>
<artifactId>spring-elasticjobl</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-elasticjobl Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.1.5.RELEASE</spring.version>
<elasticjob.version>2.1.5</elasticjob.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring引用上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--elastic-job-->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>${elasticjob.version}</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>${elasticjob.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<!--項目運行後不會依賴這個jar包,打包時會自動生成get,set方法-->
<scope>provided</scope>
</dependency>
<!--引入日誌適配器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
</dependency>
</dependencies>
<build>
<finalName>spring-elasticjob</finalName>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd
">
</beans>
- 在web.xml配置Listener,監聽Spring容器
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>spring-elasticjob</display-name>
<!--配置上下文的參數-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-config.xml</param-value>
</context-param>
<!--配置監聽器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
- 在spring-config.xml文件中,配置zk註冊中心,配置Simple作業
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd
">
<!--註冊中心配置-->
<reg:zookeeper server-lists="localhost:2181" namespace="spring-elasticjob" id="zkCenter"/>
<!--simple作業配置-->
<job:simple registry-center-ref="zkCenter" cron="0/10 * * * * ?" sharding-total-count="2"
class="com.zcw.job.MySimpleJob"/>
</beans>
- 安裝Tomcat-插件
https://tomcat.apache.org/
- 最終的修改的pom文件
<?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.zcw</groupId>
<artifactId>spring-elasticjobl</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-elasticjobl Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.1.5.RELEASE</spring.version>
<elasticjob.version>2.1.5</elasticjob.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring引用上下文-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--elastic-job-->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>${elasticjob.version}</version>
</dependency>
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>${elasticjob.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<!--項目運行後不會依賴這個jar包,打包時會自動生成get,set方法-->
<scope>provided</scope>
</dependency>
<!--引入日誌適配器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
</dependency>
</dependencies>
<build>
<finalName>spring-elasticjob</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>/</path>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 打成war包,放入Tomcat啓動Elastic-Job定時任務
啓動zookeeper:單機版
【友情提示:】使用Tomcat-Maven 插件時,修改端口號
tomcat7:run -f pom.xml -Dmaven.tomcat.port=8022
Spring的schema整合Dataflow
- 創建類
package com.zcw.job;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName : MyDataflowJob
* @Description :
* @Author : Zhaocunwei
* @Date: 2020-06-05 14:22
*/
public class MyDataflowJob implements DataflowJob<Integer> {
private List<Integer> list = new ArrayList<>();
{
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
}
@Override
public List<Integer> fetchData(ShardingContext shardingContext) {
//數字 % 分片總數 == 當前分片項
List<Integer> integers = new ArrayList<>();
for(Integer index: list){
if(index % shardingContext.getShardingTotalCount() == shardingContext.getShardingItem()){
integers.add(index);
break;
}
}
System.out.println("我是分片項:"+shardingContext.getShardingItem()+",我獲取的數據是:"+integers);
return integers;
}
@Override
public void processData(ShardingContext shardingContext, List<Integer> data) {
list.removeAll(data);
System.out.println("我是分片項:"+shardingContext.getShardingItem()+",我移除數據是:"+data);
}
}
- 配置dataflow–spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd
">
<!--註冊中心配置-->
<reg:zookeeper server-lists="localhost:2181" namespace="spring-elasticjob" id="zkCenter"/>
<!--simple作業配置-->
<job:simple id="mySimpleJob" registry-center-ref="zkCenter" cron="0/10 * * * * ?" sharding-total-count="2"
class="com.zcw.job.MySimpleJob" overwrite="true"/>
<!--Dataflow作業-->
<job:dataflow id="myDataflowJob" registry-center-ref="zkCenter" cron="0/10 * * * * ?" sharding-total-count="2"
class="com.zcw.job.MyDataflowJob" overwrite="true" streaming-process="true"/>
</beans>
- 測試