Elastic-Job的SimpleJob类型作业
Simple类型作业意为简单实现,未经任何封装的类型。需要继承AbstractSimpleElasticJob,该类只提供了一个方法用于覆盖,此方法将被定时执行。用于执行普通的定时任务,与Quartz原生接口相似,只是增加了弹性扩缩容和分片等功能。
引入maven依赖
elastic-job已经发布到中央仓库,可以在pom.xml文件中直接引入maven坐标。
<!-- 当当分布式任务调度 -->
<!-- 引入elastic-job核心模块 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-core</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 使用springframework自定义命名空间时引入 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-spring</artifactId>
<version>1.1.1</version>
</dependency>
SimpleJob
@Component("simpleElasticJob")
public class DemoSimpleElasticJob extends AbstractSimpleElasticJob {
@Override
public void process(JobExecutionMultipleShardingContext jobExecutionMultipleShardingContext) {
// do something by sharding items
}
}
Spring命名空间配置
<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 id="regCenter" server-lists="${JOB_URL}"-->
<!--namespace="${namespace}" base-sleep-time-milliseconds="1000"-->
<!--max-sleep-time-milliseconds="3000" max-retries="3" />-->
<!--配置作业注册中心 -->
<bean id="zkConfig" class="com.dangdang.ddframe.reg.zookeeper.ZookeeperConfiguration">
<property name="serverLists" value="${worker.zk.servers.urls}"/>
<property name="namespace" value="${namespace}"/>
<property name="baseSleepTimeMilliseconds" value="1000"/>
<property name="maxSleepTimeMilliseconds" value="3000"/>
<property name="maxRetries" value="3"/>
</bean>
<bean id="regCenter" class="com.dangdang.ddframe.reg.zookeeper.ZookeeperRegistryCenter" init-method="init">
<constructor-arg ref="zkConfig"/>
</bean>
<!-- 每隔三分钟执行一次测试任务 -->
<job:simple id="simpleElasticJob" class="com.worker.service.worker.DemoSimpleElasticJob" registry-center-ref="regCenter" cron="0 0/3 * * * ?" sharding-total-count="1" ></job:simple>
</beans>
reg:bean命名空间属性详细说明
属性名 | 类型 | 是否必填 | 缺省值 | 描述 |
---|---|---|---|---|
id | String | 是 | 注册中心在Spring 容器中的主键 | |
server-lists | String | 是 | 连接Zookeeper 服务器的列表包括IP地址和端口号 多个地址用逗号分隔 如: host1:2181,host2:2181 | |
namespace | String | 是 | Zookeeper 的命名空间 | |
base-sleep-time-milliseconds | int | 否 | 1000 | 等待重试的间隔时间的初始值 单位:毫秒 |
max-sleep-time-milliseconds | int | 否 | 3000 | 等待重试的间隔时间的最大值 单位:毫秒 |
max-retries | int | 否 | 3 | 最大重试次数 |
session-timeout-milliseconds | int | 否 | 60000 | 会话超时时间 单位:毫秒 |
connection-timeout-milliseconds | int | 否 | 15000 | 连接超时时间 单位:毫秒 |
digest | String | 否 | 无验证 | 连接Zookeeper 的权限令牌缺省为不需要权限验证 |
nested-port | int | 否 | -1 | 内嵌Zookeeper 的端口号-1表示不开启内嵌 Zookeeper |
nested-data-dir | String | 否 | 内嵌Zookeeper 的数据存储路径为空表示不开启内嵌 Zookeeper |
job:simple命名空间属性详细说明
属性名 | 类型 | 是否必填 | 缺省值 | 描述 |
---|---|---|---|---|
id | String | 是 | 作业名称 | |
class | String | 否 | 作业实现类,需实现ElasticJob 接口,脚本型作业不需要配置 | |
registry-center-ref | String | 是 | 注册中心Bean 的引用,需引用reg:zookeeper 的声明 | |
cron | String | 是 | cron 表达式,用于配置作业触发时间 | |
sharding-total-count | int | 是 | 作业分片总数 | |
sharding-item-parameters | String | 否 | 分片序列号和参数用等号分隔,多个键值对用逗号分隔 分片序列号从 0 开始,不可大于或等于作业分片总数如: 0=a,1=b,2=c | |
job-parameter | String | 否 | 作业自定义参数 可以配置多个相同的作业,但是用不同的参数作为不同的调度实例 | |
monitor-execution | boolean | 否 | true | 监控作业运行时状态 每次作业执行时间和间隔时间均非常短的情况,建议不监控作业运行时状态以提升效率。因为是瞬时状态,所以无必要监控。请用户自行增加数据堆积监控。并且不能保证数据重复选取,应在作业中实现幂等性。 每次作业执行时间和间隔时间均较长的情况,建议监控作业运行时状态,可保证数据不会重复选取。 |
monitor-port | int | 否 | -1 | 作业监控端口 建议配置作业监控端口, 方便开发者dump作业信息。 使用方法: echo “dump” | nc 127.0.0.1 9888 |
max-time-diff-seconds | int | 否 | -1 | 最大允许的本机与注册中心的时间误差秒数 如果时间误差超过配置秒数则作业启动时将抛异常 配置为 -1 表示不校验时间误差 |
failover | boolean | 否 | false | 是否开启失效转移 仅 monitorExecution 开启,失效转移才有效 |
misfire | boolean | 否 | true | 是否开启错过任务重新执行 |
job-sharding-strategy-class | String | 否 | true | 作业分片策略实现类全路径 默认使用平均分配策略 详情参见:作业分片策略 |
description | String | 否 | 作业描述信息 | |
disabled | boolean | 否 | false | 作业是否禁止启动 可用于部署作业时,先禁止启动,部署结束后统一启动 |
overwrite | boolean | 否 | false | 本地配置是否可覆盖注册中心配置 如果可覆盖,每次启动作业都以本地配置为准 |
Spring集成Quartz定时任务
增加Quartz的Maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
Spring配置
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
default-autowire="byName">
<!-- CronTask -->
<bean id="cronTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="generateSettlementForNatureWeekTaskJob" />
<property name="cronExpression" value="${ecc.worker.generate.settlement.nature.week}"></property>
</bean>
<bean id="cronTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--实际调用类-->
<property name="targetObject" ref="cronTask" />
<!--实际调用方法-->
<property name="targetMethod" value="execute" />
</bean>
<bean id="cronTask" class="com.b2b.worker.service.worker.CronTask" />
</beans>
在线cron表达式:http://cron.qqe2.com/