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系列之一> ...
随机推荐
- 自学PHP笔记(五) PHP运算符
本文转发来自:自学PHP笔记(五) PHP运算符 首先我们需要了解运算符是什么,运算符是指的对变量.常量或者数据进行计算的一个符号,比如数学中学到的加减乘除等用来运算的代表符号,PHP中的运算符也是这 ...
- java反射Array的使用
1.什么是Array Array是一个类的简写,全限定类名是java.lang.reflect.Array. 2.Array有什么用 Array可以代表所有的数组,可以通过Array动态创建与修改里面 ...
- C#入门到精通系列课程——第2章编写C#程序
◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- Mysql下可能存在注入的点。
总结下mysql下可能存在注入的点,适用于mssql和oracle,先写语句,以后再写语句可能出现在哪些场景下: 针对查询: select * from x where id=* select * f ...
- Average Score39届亚洲赛牡丹江站A题
题意: A班有n个人,B班有m个人,然后现在给你n-1个A班人的成绩,和m个B班人的成绩,然后题目要求求出A班剩下的没给成绩那个人的成绩范围,要求是这个人从A班转到B班后能使A,B的平均分 ...
- hdu4911 简单树状数组
题意: 给你一串数字,然后给你最多进行k次交换(只能交换相邻的)问交换后的最小逆序数是多少. 思路: 首先要知道的一个就是给你一个序列,每次只能交换相邻的位置,把他交换成一个递增序 ...
- spring和mybatis整合时Access denied for user '***'@'localhost' (using password: YES)错误的解决方案
参考文章:博客园文章 参考解决办法: 将数据库配置文件格式 key=value 改为 jdbc.key=value 以下为问题分析 使用Spring + Mybatis + Mysql整合时,测试报错 ...
- PHP基础-PHP中的函数声明
/* PHP的变量的范围* 局部变量: 在函数中声明的变量就是局部变量,只能在自己的函数内部使用.* 全局变量: 在函数外声明,在变量声明以后的,直到整个脚本结束前都可以使用,包括在函数中和{}中都可 ...
- solidworks中 toolbox调用出现未配置的解决方法
解决步骤:1:win7卸载安全补丁:KB3072630 WIN10,忽略.2:关闭所有Solidworks的进程3:CMD命令行进入:cd c:\program files\solidwokrs co ...