背景:一个定时任务在不同的环境下,switch开关状态不同,要求只在正式生产环境这个开关是打开的,但是由于版本控制问题,这开关配置的配置文件不是最新代码高度。就导致代码中取这个值时,发现是一个空值,导致了空指针异常。并且定时任务中的任务也不能正常使用。
难点:由于是生产环境,这个不能只因为这么一个bug,就将整个服务器重启。就需要有一个热更新一样的操作。将实例内的成员变量值,从null变为true。
主要用到的命令:
sc -d com.cyou.dream.scheduled.task.FixedTimeTasks
options strict false
ognl -c 67b92f0a '#context=@org.gamedo.ApplicationBase@context(),#context.getBean("fixedTimeTasks").aSwitch=true' -x 2
ognl -c 67b92f0a '#context=@org.gamedo.ApplicationBase@context(),#context.getBean("fixedTimeTasks").aSwitch' -x 2
解释:
sc -d com.cyou.dream.scheduled.task.FixedTimeTasks
用法: cs -d 加一个类的全路径名称
这个命令sc,是查询一个类,加-d是查询这个类的详细信息会出现以下数据。
其中框出来的是重要数据后面会用到。
options strict false
这一步会让后续的ognl命令忽略报错。
ognl -c 71bc1ae4 '#context=@org.gamedo.ApplicationBase@context(),#context.getBean("fixedTimeTasks").aSwitch' -x 2
以上代码查看成员变量的值如下:
ognl -c 71bc1ae4 '#context=@org.gamedo.ApplicationBase@context(),#context.getBean("fixedTimeTasks").aSwitch=true' -x 2
其中 71bc1ae4 就是被框起来的部分,是这个示例的id
org.gamedo.ApplicationBase是启动类
fixedTimeTasks目标实例
aSwitch就是我要改的变量值
改变结果如下:
修改完毕!!