ElasticJob-Lite 提供自定义的 Spring 命名空间,可以与 Spring 容器配合使用。 开发者能够便捷的在作业中通过依赖注入使用 Spring 容器管理的数据源等对象,并使用占位符从属性文件中取值。

作业配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:elasticjob="http://shardingsphere.apache.org/schema/elasticjob"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://shardingsphere.apache.org/schema/elasticjob
  8. http://shardingsphere.apache.org/schema/elasticjob/elasticjob.xsd
  9. ">
  10. <!--配置作业注册中心 -->
  11. <elasticjob:zookeeper id="regCenter" server-lists="yourhost:2181" namespace="my-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
  12. <!-- 配置作业 Bean -->
  13. <bean id="myJob" class="xxx.MyJob">
  14. <property name="fooService" ref="xxx.FooService" />
  15. </bean>
  16. <!-- 配置基于 class 的作业调度 -->
  17. <elasticjob:job id="${myJob.id}" job-ref="myJob" registry-center-ref="regCenter" sharding-total-count="${myJob.shardingTotalCount}" cron="${myJob.cron}" />
  18. <!-- 配置基于 type 的作业调度 -->
  19. <elasticjob:job id="${myScriptJob.id}" job-type="SCRIPT" registry-center-ref="regCenter" sharding-total-count="${myScriptJob.shardingTotalCount}" cron="${myScriptJob.cron}">
  20. <props>
  21. <prop key="script.command.line">${myScriptJob.scriptCommandLine}</prop>
  22. </props>
  23. </elasticjob:job>
  24. </beans>

作业启动

定时调度

将配置 Spring 命名空间的 xml 通过 Spring 启动,作业将自动加载。

一次性调度

一次性调度的作业的执行权在开发者手中,开发者可以在需要调用作业的位置注入 OneOffJobBootstrap, 通过 execute() 方法执行作业。

  1. <bean id="oneOffJob" class="org.apache.shardingsphere.elasticjob.lite.example.job.simple.SpringSimpleJob" />
  2. <elasticjob:job id="oneOffJobBean" job-ref="oneOffJob" ... />
  1. public final class SpringMain {
  2. public static void main(final String[] args) {
  3. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/application-context.xml");
  4. OneOffJobBootstrap oneOffJobBootstrap = context.getBean("oneOffJobBean", OneOffJobBootstrap.class);
  5. oneOffJobBootstrap.execute();
  6. }
  7. }

配置作业导出端口

使用 ElasticJob-Lite 过程中可能会碰到一些分布式问题,导致作业运行不稳定。

由于无法在生产环境调试,通过 dump 命令可以把作业内部相关信息导出,方便开发者调试分析;

导出命令的使用请参见运维指南

以下示例用于展示如何通过 Spring 命名空间开启用于导出命令的监听端口。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:elasticjob="http://shardingsphere.apache.org/schema/elasticjob"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://shardingsphere.apache.org/schema/elasticjob
  8. http://shardingsphere.apache.org/schema/elasticjob/elasticjob.xsd
  9. ">
  10. <!--配置作业注册中心 -->
  11. <elasticjob:zookeeper id="regCenter" server-lists="yourhost:2181" namespace="dd-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
  12. <!--配置任务快照导出服务 -->
  13. <elasticjob:snapshot id="jobSnapshot" registry-center-ref="regCenter" dump-port="9999" />
  14. </beans>

配置错误处理策略

使用 ElasticJob-Lite 过程中当作业发生异常后,可采用以下错误处理策略。

错误处理策略名称说明是否内置是否默认是否需要额外配置
记录日志策略记录作业异常日志,但不中断作业执行
抛出异常策略抛出系统异常并中断作业执行
忽略异常策略忽略系统异常且不中断作业执行
邮件通知策略发送邮件消息通知,但不中断作业执行
企业微信通知策略发送企业微信消息通知,但不中断作业执行
钉钉通知策略发送钉钉消息通知,但不中断作业执行

以下示例用于展示如何通过 Spring 命名空间配置错误处理策略。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <elasticjob:job xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:elasticjob="http://shardingsphere.apache.org/schema/elasticjob"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://shardingsphere.apache.org/schema/elasticjob
  8. http://shardingsphere.apache.org/schema/elasticjob/elasticjob.xsd
  9. ">
  10. <!-- 记录日志策略 -->
  11. <elasticjob:job ... job-error-handler-type="LOG" />
  12. <!-- 抛出异常策略 -->
  13. <elasticjob:job ... job-error-handler-type="THROW" />
  14. <!-- 忽略异常策略 -->
  15. <elasticjob:job ... job-error-handler-type="IGNORE" />
  16. <!-- 邮件通知策略 -->
  17. <elasticjob:job ... job-error-handler-type="EMAIL">
  18. <props>
  19. <prop key="email.host">${host}</prop>
  20. <prop key="email.port">${port}</prop>
  21. <prop key="email.username">${username}</prop>
  22. <prop key="email.password">${password}</prop>
  23. <prop key="email.useSsl">${useSsl}</prop>
  24. <prop key="email.subject">${subject}</prop>
  25. <prop key="email.from">${from}</prop>
  26. <prop key="email.to">${to}</prop>
  27. <prop key="email.cc">${cc}</prop>
  28. <prop key="email.bcc">${bcc}</prop>
  29. <prop key="email.debug">${debug}</prop>
  30. </props>
  31. </elasticjob:job>
  32. <!-- 企业微信通知策略 -->
  33. <elasticjob:job ... job-error-handler-type="WECHAT">
  34. <props>
  35. <prop key="wechat.webhook">${webhook}</prop>
  36. <prop key="wechat.connectTimeoutMilliseconds">${connectTimeoutMilliseconds}</prop>
  37. <prop key="wechat.readTimeoutMilliseconds">${readTimeoutMilliseconds}</prop>
  38. </props>
  39. </elasticjob:job>
  40. <!-- 钉钉通知策略 -->
  41. <elasticjob:job ... job-error-handler-type="DINGTALK">
  42. <props>
  43. <prop key="dingtalk.webhook">${webhook}</prop>
  44. <prop key="dingtalk.keyword">${keyword}</prop>
  45. <prop key="dingtalk.secret">${secret}</prop>
  46. <prop key="dingtalk.connectTimeoutMilliseconds">${connectTimeoutMilliseconds}</prop>
  47. <prop key="dingtalk.readTimeoutMilliseconds">${readTimeoutMilliseconds}</prop>
  48. </props>
  49. </elasticjob:job>
  50. </beans>