ElasticJob 3.0.0-alpha 自定义JobErrorHandler

起因

leader 要求任务调度得实现故障转移错误重试
令人尴尬的是,elasticJob只有失效转移,并没有错误重试。
不过xxljob可以进行失败错误:

这就真的很尴尬了 : )

有个解决方案,可以利用spring的重试机制,点这里查看详情。

但我这倔脾气起来了,我特么就是不想引用包,就不能解决了??

然后就有了这篇文章,泪目,泪目!!!

正文

ElasticJobConfigurationProperties

先去属性配置类里面康康:

@Getter
@Setter
public class ElasticJobConfigurationProperties {private Class<? extends ElasticJob> elasticJobClass;private String elasticJobType;private String cron;private String jobBootstrapBeanName;private int shardingTotalCount;private String shardingItemParameters;private String jobParameter;private boolean monitorExecution;private boolean failover;private boolean misfire;private int maxTimeDiffSeconds = -1;private int reconcileIntervalMinutes;private String jobShardingStrategyType;private String jobExecutorServiceHandlerType;private String jobErrorHandlerType;private String description;private Properties props = new Properties();private boolean disabled;private boolean overwrite;public JobConfiguration toJobConfiguration(final String jobName) {......}
}

然后,你会惊讶的发现,真的很官网上说的一样,关于错误重试的字眼一点点都没有

柳暗花明又一村,可能是被上帝摸了摸头。在elasticJob的common包下,看见了异常处理handle的实现。

心跳有点止不住。。。。。。

随后在属性配置类中,找到了jobErrorHandlerType属性

内心的戏好像已经停不下来了。。。。。

思路:通过自定义JobErrorHandler,来达到错误重试效果

RetryJobErrorHandler

@Component
@Slf4j
public class RetryJobErrorHandler implements JobErrorHandler {private ElasticJobExecutor jobExecutor;private static int RETRY_TIME = 3;@Overridepublic void handleException(String jobName, Throwable cause) {log.error(String.format("Job '%s' exception occur in job processing, start retry {}", jobName, RETRY_TIME), cause);if (RETRY_TIME == 0) {log.error(String.format("Job '%s' exception occur in job processing, retry still failure", jobName), cause);return;}jobExecutor.execute();RETRY_TIME--;}@Overridepublic String getType() {return "Retry";}
}
    simpleJob-user:elasticJobClass: io.will.ejob.job.UserSimpleJobcron: 0/10 * * * * ?shardingTotalCount: 3overwrite: truejobErrorHandlerType: io.will.ejob.retry.RetryJobErrorHandler

写完自定义类,并在yaml中配置好类路径,已经止不住笑起来了

跑起来先:

Caused by: org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException: Can not find job error handler type 'io.will.ejob.retry.RetryJobErrorHandler'.at org.apache.shardingsphere.elasticjob.infra.handler.error.JobErrorHandlerFactory.getHandler(JobErrorHandlerFactory.java:56) ~[elasticjob-infra-common-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor.<init>(ElasticJobExecutor.java:76) ~[elasticjob-executor-kernel-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor.<init>(ElasticJobExecutor.java:63) ~[elasticjob-executor-kernel-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler.<init>(JobScheduler.java:86) ~[elasticjob-lite-core-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap.<init>(ScheduleJobBootstrap.java:43) ~[elasticjob-lite-core-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.lite.spring.boot.job.ElasticJobLiteAutoConfiguration.registerClassedJob(ElasticJobLiteAutoConfiguration.java:114) ~[elasticjob-lite-spring-boot-starter-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.lite.spring.boot.job.ElasticJobLiteAutoConfiguration.constructJobBootstraps(ElasticJobLiteAutoConfiguration.java:97) ~[elasticjob-lite-spring-boot-starter-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.lite.spring.boot.job.ElasticJobLiteAutoConfiguration.createJobBootstrapBeans(ElasticJobLiteAutoConfiguration.java:70) ~[elasticjob-lite-spring-boot-starter-3.0.0-alpha.jar:3.0.0-alpha]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]... 19 common frames omitted

我还是太年轻!!!

找问题

怎么会找不到呐,没有理由找不到啊,放容器里面了的啊

对比了下yaml配置类里的 elasticJobClass 和 jobErrorHandlerType

嗯??? class??type??莫非不是写类路径??

再进入ElasticJobConfigurationProperties 类中康康:

......
private Class<? extends ElasticJob> elasticJobClass;
......
private String jobErrorHandlerType;
......

是咯!!!一个是类,一个是String,肯定找不到

    simpleJob-user:elasticJobClass: io.will.ejob.job.UserSimpleJobcron: 0/10 * * * * ?shardingTotalCount: 3overwrite: truejobErrorHandlerType: Retry

好像看见了胜利的手,再向我招来!!!

Caused by: org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException: Can not find job error handler type 'Retry'.at org.apache.shardingsphere.elasticjob.infra.handler.error.JobErrorHandlerFactory.getHandler(JobErrorHandlerFactory.java:56) ~[elasticjob-infra-common-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor.<init>(ElasticJobExecutor.java:76) ~[elasticjob-executor-kernel-3.0.0-alpha.jar:3.0.0-alpha]at org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor.<init>(ElasticJobExecutor.java:63) ~......

傻眼了!!!还是不可以!!!

Debug

事到如今,也只剩下Debug,进去康康到底发生了什么。。。泪目!!!


嗯嗯能够拿到Type,再进去康康


找到原因了:是在类加载时候,自定义JobErrorHandler走远了

我好像有点肝不动了 !!!

解决方法

  1. 反射

直接上代码:

static {try {HashMap<String, JobErrorHandler> stringJobErrorHandlerHashMap = new LinkedHashMap<>();RetryJobErrorHandler retryJobErrorHandler = new RetryJobErrorHandler();stringJobErrorHandlerHashMap.put("Retry", retryJobErrorHandler);Class<?> factoryClass = Class.forName("org.apache.shardingsphere.elasticjob.infra.handler.error.JobErrorHandlerFactory");Field[] fields = factoryClass.getDeclaredFields();Field handlers = null;for (int i = 0; i < fields.length; i ++) {fields[i].setAccessible(true);System.out.println(fields[i].getName());if (fields[i].getName().equals("HANDLERS")) {handlers = fields[i];}}int modify = handlers.getModifiers();handlers.setAccessible(true);Field modifiersField = Field.class.getDeclaredField("modifiers");modifiersField.setAccessible(true);// 修改权限modify = handlers.getModifiers() & ~Modifier.FINAL;//更改目标对象的修饰符modifiersField.setInt(handlers, modify);handlers.set(null, stringJobErrorHandlerHashMap);System.out.println(handlers);} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}

看截图:

  1. Java configuration

人家大佬是这么说的:

使用配置类:

// 待更新

ElasticJob 3.0.0-alpha 利用自定义JobErrorHandler实现错误重试相关推荐

  1. vfp报表纸张设置_VFP 9.0中实现多种自定义纸张格式的报表打印

    VFP 9.0 中实现多种自定义纸张格式的报表打印 徐小栋 [期刊名称] <福建电脑> [年 ( 卷 ), 期] 2009(025)001 [摘要] 该文叙述了在 VFP 9.0 开发的应 ...

  2. DirectX9.0 (10) Alpha混合

    引言 在前面几篇博文中,已经陆续讲解了光照处理,和纹理映射的内容.现在来讲解一些更有趣的东西.Alpha混合,总是出现在各种各样的游戏中.我们无时无刻都在和它进行打交道,所以很有必要掌握如何进行Alp ...

  3. Salesforce系列(0):利用salesforce(sfdc)自带的IDE来编写并调试Apex类(入门级-调试篇)

    Salesforce系列(0):利用salesforce(sfdc)自带的IDE来编写并调试Apex类(入门级-调试篇) 前言 今天博主将为大家分享:Salesforce系列(0):利用salesfo ...

  4. paddle2.0高层API实现自定义数据集文本分类中的情感分析任务

    paddle2.0高层API实现自定义数据集文本分类中的情感分析任务 本文包含了: - 自定义文本分类数据集继承 - 文本分类数据处理 - 循环神经网络RNN, LSTM - ·seq2vec· - ...

  5. CVE-2021-40444 0 day漏洞利用

    9月7日,微软发布安全公告称发现Windows IE MSHTML中的一个远程代码执行漏洞,CVE编号为CVE-2021-40444.由于未发布漏洞补丁,微软只称该漏洞可以利用恶意ActiveX控制来 ...

  6. QQ 5.0侧滑HorizontalScrollView以及自定义ViewGroup

      一般侧滑的实现: 自定义的ViewGroup(menu+content) ouTouchEvent事件改变ViewGroup的LeftMargin. 大于菜单的一半显示,小于则隐藏(使用Scrol ...

  7. TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric

    文章目录 1. Keras Sequential / Functional API 2. 自定义 layer 3. 自定义 loss 4. 自定义 评估方法 学习于:简单粗暴 TensorFlow 2 ...

  8. Packet Tracer 5.0实验(四) 利用三层交换机实现VLAN间路由

    一.实验目标 掌握交换机Tag VLAN 的配置: 掌握三层交换机基本配置方法: 掌握三层交换机VLAN路由的配置方法: 通过三层交换机实现VLAN间相互通信: 二.实验背景 某企业有两个主要部门,技 ...

  9. WPF 自定义 MessageBox (相对完善版 v1.0.0.6)

    基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当你不得不弹出一个消息框通知用户消息时(虽然很不建议在程序中频繁 ...

最新文章

  1. .Net转Java自学之路—基础巩固篇一
  2. 【FPGA】SRIO例子程序仿真分析实践
  3. MySQL二进制日志文件过期天数设置说明
  4. Hadoop伪分布安装及简单使用
  5. 离散小波变换 python_CDF 9/7离散小波变换(卷积)
  6. 关于VS附加调试Unity引起卡顿无响应问题
  7. Java ServletContextListener监听器的使用
  8. html div p 区别,html中div br p三者有什么区别?
  9. 剑指 Offer 44. 数字序列中某一位的数字
  10. Android之实现多桌面图标app入口进入不同的页面,像2个独立运行的app一样,互不干扰。
  11. 深度残差收缩网络:(一)背景知识
  12. (并查集)How Many Tables -- HDU --1213
  13. Ubuntu查看文件夹占用空间大小以及磁盘空间大小
  14. 内网安全 域环境的搭建(模仿真实内网环境 做渗透测试.)
  15. 长江后浪推前浪, “趣出行”死在“火牛”的沙滩上
  16. 谷歌身份验证器二维码
  17. 移动云5G消息平台技术架构
  18. CAD软件中如何统一文字字高?
  19. cursor的所有样式
  20. 网上书城项目前端界面设计及编码

热门文章

  1. php5的内置数组,php 内置数组(     )可以获取服务器内变量信息。
  2. 2020身高体重标准表儿童_2020身高体重标准表儿童1-12岁
  3. 对付身体小毛病的80妙招
  4. java计算机毕业设计文献管理平台源码+系统+数据库+lw文档+mybatis+运行部署
  5. Python下Open3D实现纹理贴图渲染
  6. node.js 详解
  7. 关于机器学习特征顺序是否影响决策树分类效能
  8. Codeforces Global Round 19 ABC
  9. 10.数据结构:栈和队列
  10. 大话备考之数据结构综合题