1. 前言
在测试环境经常需要手工触发Java应用中的定时任务,如果定时任务没有使用Quartz,Java应用中也没有提供其他方法手工触发定时任务,可以使用Arthas快速实现以上目的。
以下使用Arthas动态触发Java定时任务的前提是:定时任务类为Spring Bean,Java项目中存在公共静态方法可以获取到Spring Context,如以下使用的SpringContextUtil类的getSpringContext()方法,代码见附录。
2. Arthas使用说明
2.1. 官方文档
https://arthas.aliyun.com/doc/quick-start.html
Arthas官方文档中考虑的情况比较多,对于使用Arthas动态触发Java定时任务的需求,只需要按照以下步骤执行即可。
2.2. 安装
可从以下地址下载Arthas压缩包arthas-bin.zip,版本为3.5.1,发布时间为2021年5月13日。
将以上压缩包上传至对应服务器中并解压。
unzip arthas-bin.zip -d arthas-bin
2.3. 启动Arthas
执行解压产生目录中的“sh as.sh”,选择需要attach的Java进程,若只存在一个进程则可直接回车,若存在多个则需要输入对应编号后回车。
3. 使用Arthas动态触发Java定时任务
在启动Arthas后执行以下命令:
ognl '@xxx.SpringContextUtil@getSpringContext().getBean("xxx.xxxTask").startTask()'
以上命令通过SpringContextUtil.getSpringContext()方法获得Spring Context后,获得定时任务对应的Bean,再调用其方法,达到手工触发定时任务的功能。
以上xxx.xxxTask为对应Spring Bean的名称,定时任务执行的方法为“public void startTask()”。
使用以下命令,可以查看全部Spring Bean的名称。
ognl '@xxx.SpringContextUtil@getSpringContext().getBeanDefinitionNames()'
4. 附录
SpringContextUtil类代码如下:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@Lazy(false)
@Component("xxx.SpringContextUtil")
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext springContext;
public static ApplicationContext getSpringContext() {
return springContext;
}
public static void setSpringContext(ApplicationContext springContext) {
SpringContextUtil.springContext = springContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
setSpringContext(applicationContext);
}
}