动态数据源对定时任务的特殊处理
项目中动态数据源的实现是通过在请求头中新增一个参数来判断具体使用哪个数据源,而定时任务并不会发起请求,所以对于所有的定时任务都需要循环遍历数据源,用每个数据源分别执行一次。
循环执行定时任务的工具类如下所示。
/**
* clazzName : 定时任务所在的类路径 例如 com.shadowT.test.TastTest
* methodName : 定时任务方法名 例如 task1
**/
public void iteratorTenant(String clazzName, String methodName) {
Class clazz = Class.forName(clazzName);
Method method = clazz.getDeclaredMthod(methodName);
// 循环遍历数据源
for (Map.Entry<Object, Object> entry : DataSourceConfig.dataSourceMap.entrySet()) {
// 切换数据源
TenantCodeHolder.setTenantCode(entry.getKey().toString());
// 执行具体的定时任务方法
method.invoke(applicationContext.getBean(clazz));
// 销毁数据源
TenantCodeHolder.removeTenantCode();
}
}