xxl-job使用遇到的问题(二)
xxl-job使用遇到的问题(二)
关联阅读 xxl-job使用遇到的问题(一)
1、问题现象
最近有个老定时任务迁移到xxl-job的时候,遇到一个小问题。虽然很快解决,但是还是有必要记录一下~
job迁移的时候,在执行方法上标记@XxlJob("test"),然后在管理控制台上,添加任务,点击执行一次的时候,调度日志提示
>>>>>>>>>>>触发调度<<<<<<<<<<<
触发调度:
address:http://10.25.31.45:9999/
code:500
msg:job handler [test] not found.
检查了下代码,没啥问题。注解加了,XxlJobSpringExecutor也有,properties配置也ok,为啥提示找不到呢?
大致代码也贴一下
public interface ITestJob {
void method1();
}
@Service
public class TestJobImpl implements ITestJob {
@XxlJob("test")
public ReturnT<String> demoJobHandler() throws Exception {
// job业务逻辑【历史代码】
return ReturnT.SUCCESS;
}
// 历史代码方法
@Override
@Async
public void method1() {
// 历史代码逻辑
}
}
其实就是在历史代码的基础上,改了下方法返回值,加了个@XxlJob("test")注解。其他没动
2、排查
既然提示找不到job handler,那问题肯定是出在客户端了。
前面阅读源码的时候,已经看过,@XxlJob注解的解析是在 XxlJobSpringExecutor类里面。快读看了下这个类,重点看了下initJobHandlerMethodRepository方法
private void initJobHandlerMethodRepository(ApplicationContext applicationContext) {
if (applicationContext == null) {
return;
}
// init job handler from method
String[] beanDefinitionNames = applicationContext.getBeanNamesForType(Object.class, false, true);
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
Map<Method, XxlJob> annotatedMethods = null; // referred to :org.springframework.context.event.EventListenerMethodProcessor.processBean
try {
annotatedMethods = MethodIntrospector.selectMethods(bean.getClass(),
new MethodIntrospector.MetadataLookup<XxlJob>() {
@Override
public XxlJob inspect(Method method) {
return AnnotatedElementUtils.findMergedAnnotation(method, XxlJob.class);
}
});
} catch (Throwable ex) {
logger.error("xxl-job method-jobhandler resolve error for bean[" + beanDefinitionName + "].", ex);
}
if (annotatedMethods==null || annotatedMethods.isEmpty()) {
continue;
}
......
}
在这块加个断点看看,果然拿到的 annotatedMethods 是空的,难怪提示找不到呢!
3、原因
上面的demoJobHandler方法头上标记了注解的,为什么annotatedMethods是空的呢?
这是因为下面这行代码取到的bean,不是TestJobImpl这个类
Object bean = applicationContext.getBean(beanDefinitionName);
而是一个代理类,并且是jdk的动态代理的类。
jdk动态代理,啥特性?
嗯,基于接口的~~,接口里面只申明了一个方法 method1,那【MethodIntrospector.selectMethods】肯定找不到有XxlJob注解的方法了!
3.1、 解决办法
知道了这一点,那就好解决了。
可供参考的解决办法:
方法一、把job这个方法单独拎出来
方法二、去掉接口,让Spring使用cglib的代理。这样取到的代理类就包含2个方法了,就可以找到有注解的那个方法了
方法三、如果上面2个都不想改,那就在接口里面申明一个demoJobHandler方法,并且在接口方法申明上标记@XxlJob("test")注解
xxl-job使用遇到的问题(二)的更多相关文章
- 分布式消息队列XXL-MQ
<分布式消息队列XXL-MQ> 一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...
- java web学习总结(二十八) -------------------JSP中的JavaBean
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- javaweb学习总结(二十)——JavaBean总结
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- 初识Selenium(二)
---------------------------------------------------------------------------------------------------- ...
- javaweb(二十)——JavaBean总结
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- python驱动SAP完成数据导出(二)
在上一篇 python驱动SAP完成数据导出(一)中,我们提到了数据导出前,SAP布局的重要性,如何识别当前布局模式,以及如何切换到想要的布局.本篇小爬将着重讲讲数据导出的注意事项. 我们可以通过如下 ...
- SpringCloud微服务实战——搭建企业级开发框架(四十二):集成分布式任务调度平台XXL-JOB,实现定时任务功能
定时任务几乎是每个业务系统必不可少的功能,计算到期时间.过期时间等,定时触发某项任务操作.在使用单体应用时,基本使用Spring提供的注解即可实现定时任务,而在使用微服务集群时,这种方式就要考虑添 ...
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- 前端开发中SEO的十二条总结
一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
随机推荐
- win10美化,让你的win10独一无二,与众不同!
2020.06.23 更新 1 原则 美化之前,得先有一个目标对不对,笔者是一个喜欢简单的人,因此美化本着三大原则:简单,干净,整洁. 呃....好像很抽象的样子,上图吧.反正没图没真相. 怎么样,还 ...
- JAVAEE_Servlet_20_登录注册功能
实现登录注册功能 注册功能 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j ...
- Day01_08_变量(Variable)
变量 什么是变量? *变量本质上来说是内存上的一块空间,这块空间有数据类型,有名字,有字面值(数据).变量是内存中存储数据最基本的单元 * 变量要求变量中存储的具体数据必须和变量的数据类型一致,必须先 ...
- 《机器学习Python实现_10_02_集成学习_boosting_adaboost分类器实现》
一.简介 adaboost是一种boosting方法,它的要点包括如下两方面: 1.模型生成 每一个基分类器会基于上一轮分类器在训练集上的表现,对样本做权重调整,使得错分样本的权重增加,正确分类的样本 ...
- 多指灵巧手MoveIt!与Gazebo联合仿真框架搭建
至于为什么叫框架,一是因为灵巧手的3维模型没有按照基本的设计要求画,正常来说,设计机器人机构之前应该设计好机构需要多少个自由度/DOF,每个自由度是旋转/revolute类型还是滑移/prismati ...
- hdu4585 STL水题
题意: 成立少林寺,刚开始有一个大师,id是1,攻击力是10E,现在陆续来人,每个人有自己的id,和自己的攻击力,但是每一个新来的要和之前的和尚pk,他必须选择和他攻击力差值最小的那个,如 ...
- Android动态调试so库JNI_Onload函数-----基于IDA实现
之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...
- 使用 WinAFL 图片解析软件进行模糊测试 - FreeImage 图片解析库
看雪链接:https://bbs.pediy.com/thread-255162.htm
- iwrite复制攻略
打开iwrite,一提交作业,发现: 这可咋办啊! 那就跟着步骤来呗: 按F12打开元素审查 点一下左上角 再点一下文本框,就能定位到HTML中的位置 在文本框中写几个字母,康康具体位置: 那就复制进 ...
- 【】POST、GET、RequestParam、ReqestBody、FormData、request payLoad简单认知
背景: 使用vue+axios方式代替ajax后向后台发送数据出现问题了,controller获取不到数据.然后查.找.查.找中似乎找到一些门道.以下列出总结性的东西来记录自己的思考成果,仅供参考,不 ...