JIRA 6.3.1实现定时任务总结
SAL开发教程
https://www.cnblogs.com/l200702031000/p/10060021.html
总结
关于模块配置
JIRA 6.3版本中,建议使用Spring注解的方式,这与教程中的配置文件方式有出入。其中:
- 模块导入通过注解@ComponentImport完成
- 公开的模块声明通过@ExportAsService + @Component完成
@Component @ExportAsService public class Clone2OsMonitorImpl implements Clone2OsMonitor, LifecycleAware, InitializingBean, DisposableBean { static final String KEY = Clone2OsMonitorImpl.class.getName() + ":instance"; private final String JOB_NAME = Clone2OsMonitorImpl.class.getName() + ":job"; private final Logger logger = Logger.getLogger(Clone2OsMonitorImpl.class); private final PluginScheduler pluginScheduler; // provided by SAL @Inject public Clone2OsMonitorImpl(@ComponentImport PluginScheduler pluginScheduler) { logger.info("Clone2OsMonitorImpl init."); this.pluginScheduler = pluginScheduler; } ...................
运行间隔
调试过程中,发现JIRA6.3.1中,定时任务的最小间隔为1min(设置时单位为毫秒)。
若配置间隔时间小于1min,系统会按照1min执行。
注销任务
根据教程,任务的注册是在SAL的LifecycleAware - onStart方法中完成的,但JIRA6.3.1中的LifecycleAware类并没有onStop()方法,导致无法注销定时任务。
导致即使禁用了插件,定时任务仍然会持续运行。
解决方法:实现DisposableBean接口destroy方法,该方法会在插件禁用时被回调,从而实现禁用插件即停止定时任务的目的。
@Component @ExportAsService public class Clone2OsMonitorImpl implements Clone2OsMonitor, LifecycleAware, InitializingBean, DisposableBean { static final String KEY = Clone2OsMonitorImpl.class.getName() + ":instance"; private final String JOB_NAME = Clone2OsMonitorImpl.class.getName() + ":job"; private final Logger logger = Logger.getLogger(Clone2OsMonitorImpl.class); private final PluginScheduler pluginScheduler; // provided by SAL @Inject public Clone2OsMonitorImpl(@ComponentImport PluginScheduler pluginScheduler) { logger.info("Clone2OsMonitorImpl init."); this.pluginScheduler = pluginScheduler; } ................... public void destroy() throws Exception { logger.info("Clone2OsMonitorImpl: destroy called."); pluginScheduler.unscheduleJob(JOB_NAME); } }