DynamicGeneratorInterceptor.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package jnpf.database.plugins;
  2. import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
  3. import com.baomidou.dynamic.datasource.annotation.DS;
  4. import com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor;
  5. import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
  6. import com.baomidou.dynamic.datasource.processor.DsProcessor;
  7. import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
  8. import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
  9. import jnpf.database.util.ConnUtil;
  10. import jnpf.database.util.DataSourceUtil;
  11. import jnpf.util.StringUtil;
  12. import jnpf.util.context.SpringContext;
  13. import org.aopalliance.intercept.MethodInvocation;
  14. public class DynamicGeneratorInterceptor extends DynamicDataSourceAnnotationInterceptor {
  15. private DynamicRoutingDataSource dynamicRoutingDataSource;
  16. private DefaultDataSourceCreator dataSourceCreator;
  17. public DynamicGeneratorInterceptor(Boolean allowedPublicOnly, DsProcessor dsProcessor) {
  18. super(allowedPublicOnly, dsProcessor);
  19. }
  20. @Override
  21. public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  22. try {
  23. //是否继承动态生成源接口
  24. if (methodInvocation.getThis() instanceof DynamicSourceGeneratorInterface) {
  25. DS ds = methodInvocation.getThis().getClass().getAnnotation(DS.class);
  26. if (ds != null && StringUtil.isNotEmpty(ds.value())) {
  27. String datasourceName = ds.value();
  28. DynamicSourceGeneratorInterface m = (DynamicSourceGeneratorInterface) methodInvocation.getThis();
  29. String now = null;
  30. try {
  31. boolean invalid = true;
  32. if (Boolean.TRUE.equals(m.cachedConnection())) {
  33. if (dynamicRoutingDataSource == null) {
  34. dynamicRoutingDataSource = SpringContext.getBean(DynamicRoutingDataSource.class);
  35. dataSourceCreator = SpringContext.getBean(DefaultDataSourceCreator.class);
  36. }
  37. if (dynamicRoutingDataSource.getDataSources().containsKey(datasourceName)) {
  38. // if (dynamicRoutingDataSource.getCurrentDataSources().get(datasourceName).getConnection().isValid(5)) {
  39. //已存在当前动态数据源且数据源可用则不重新获取数据源配置
  40. invalid = false;
  41. // }
  42. }
  43. }
  44. if (invalid) {
  45. //重新生成动态数据源
  46. //设置为默认数据源获取动态数据源信息
  47. now = DynamicDataSourceContextHolder.push(null);
  48. DataSourceUtil dataSource = m.getDataSource();
  49. if (dataSource != null) {
  50. DataSourceProperty dataSourceProperty = new DataSourceProperty();
  51. dataSourceProperty.setUsername(dataSource.getUserName());
  52. dataSourceProperty.setPassword(dataSource.getPassword());
  53. dataSourceProperty.setUrl(ConnUtil.getUrl(dataSource));
  54. dataSourceProperty.setDriverClassName(dataSource.getDriver());
  55. dynamicRoutingDataSource.addDataSource(datasourceName, dataSourceCreator.createDataSource(dataSourceProperty));
  56. }
  57. }
  58. } finally {
  59. if (now != null) {
  60. DynamicDataSourceContextHolder.poll();
  61. }
  62. }
  63. }
  64. }
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. return methodInvocation.proceed();
  69. }
  70. }