| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package jnpf.database.plugins;
- import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
- import com.baomidou.dynamic.datasource.annotation.DS;
- import com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor;
- import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
- import com.baomidou.dynamic.datasource.processor.DsProcessor;
- import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
- import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
- import jnpf.database.util.ConnUtil;
- import jnpf.database.util.DataSourceUtil;
- import jnpf.util.StringUtil;
- import jnpf.util.context.SpringContext;
- import org.aopalliance.intercept.MethodInvocation;
- public class DynamicGeneratorInterceptor extends DynamicDataSourceAnnotationInterceptor {
- private DynamicRoutingDataSource dynamicRoutingDataSource;
- private DefaultDataSourceCreator dataSourceCreator;
- public DynamicGeneratorInterceptor(Boolean allowedPublicOnly, DsProcessor dsProcessor) {
- super(allowedPublicOnly, dsProcessor);
- }
- @Override
- public Object invoke(MethodInvocation methodInvocation) throws Throwable {
- try {
- //是否继承动态生成源接口
- if (methodInvocation.getThis() instanceof DynamicSourceGeneratorInterface) {
- DS ds = methodInvocation.getThis().getClass().getAnnotation(DS.class);
- if (ds != null && StringUtil.isNotEmpty(ds.value())) {
- String datasourceName = ds.value();
- DynamicSourceGeneratorInterface m = (DynamicSourceGeneratorInterface) methodInvocation.getThis();
- String now = null;
- try {
- boolean invalid = true;
- if (Boolean.TRUE.equals(m.cachedConnection())) {
- if (dynamicRoutingDataSource == null) {
- dynamicRoutingDataSource = SpringContext.getBean(DynamicRoutingDataSource.class);
- dataSourceCreator = SpringContext.getBean(DefaultDataSourceCreator.class);
- }
- if (dynamicRoutingDataSource.getDataSources().containsKey(datasourceName)) {
- // if (dynamicRoutingDataSource.getCurrentDataSources().get(datasourceName).getConnection().isValid(5)) {
- //已存在当前动态数据源且数据源可用则不重新获取数据源配置
- invalid = false;
- // }
- }
- }
- if (invalid) {
- //重新生成动态数据源
- //设置为默认数据源获取动态数据源信息
- now = DynamicDataSourceContextHolder.push(null);
- DataSourceUtil dataSource = m.getDataSource();
- if (dataSource != null) {
- DataSourceProperty dataSourceProperty = new DataSourceProperty();
- dataSourceProperty.setUsername(dataSource.getUserName());
- dataSourceProperty.setPassword(dataSource.getPassword());
- dataSourceProperty.setUrl(ConnUtil.getUrl(dataSource));
- dataSourceProperty.setDriverClassName(dataSource.getDriver());
- dynamicRoutingDataSource.addDataSource(datasourceName, dataSourceCreator.createDataSource(dataSourceProperty));
- }
- }
- } finally {
- if (now != null) {
- DynamicDataSourceContextHolder.poll();
- }
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return methodInvocation.proceed();
- }
- }
|