对比新文件 |
| | |
| | | package com.iailab.framework.tenant.core.service; |
| | | |
| | | import com.baomidou.dynamic.datasource.creator.DataSourceProperty; |
| | | import com.iailab.framework.common.pojo.CommonResult; |
| | | import com.iailab.framework.common.util.cache.CacheUtils; |
| | | import com.iailab.module.system.api.tenant.TenantApi; |
| | | import com.google.common.cache.CacheLoader; |
| | | import com.google.common.cache.LoadingCache; |
| | | |
| | | import com.iailab.module.system.api.tenant.dto.TenantDataSourceConfigRespDTO; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.SneakyThrows; |
| | | |
| | | import java.time.Duration; |
| | | import java.util.List; |
| | | |
| | | import static com.iailab.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; |
| | | |
| | | /** |
| | | * Tenant 框架 Service 实现类 |
| | | * |
| | | * @author iailab |
| | | */ |
| | | @RequiredArgsConstructor |
| | | public class TenantFrameworkServiceImpl implements TenantFrameworkService { |
| | | |
| | | private final TenantApi tenantApi; |
| | | |
| | | /** |
| | | * 针对 {@link #getTenantIds()} 的缓存 |
| | | */ |
| | | private final LoadingCache<Object, List<Long>> getTenantIdsCache = buildAsyncReloadingCache( |
| | | Duration.ofMinutes(1L), // 过期时间 1 分钟 |
| | | new CacheLoader<Object, List<Long>>() { |
| | | |
| | | @Override |
| | | public List<Long> load(Object key) { |
| | | return tenantApi.getTenantIdList().getCheckedData(); |
| | | } |
| | | |
| | | }); |
| | | |
| | | /** |
| | | * 针对 {@link #validTenant(Long)} 的缓存 |
| | | */ |
| | | private final LoadingCache<Long, CommonResult<Boolean>> validTenantCache = buildAsyncReloadingCache( |
| | | Duration.ofMinutes(1L), // 过期时间 1 分钟 |
| | | new CacheLoader<Long, CommonResult<Boolean>>() { |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> load(Long id) { |
| | | return tenantApi.validTenant(id); |
| | | } |
| | | |
| | | }); |
| | | |
| | | /** |
| | | * 针对 {@link #getDataSourceProperty(Long)} 的缓存 |
| | | */ |
| | | private final LoadingCache<Long, DataSourceProperty> dataSourcePropertyCache = CacheUtils.buildAsyncReloadingCache( |
| | | Duration.ofMinutes(1L), // 过期时间 1 分钟 |
| | | new CacheLoader<Long, DataSourceProperty>() { |
| | | |
| | | @Override |
| | | public DataSourceProperty load(Long id) { |
| | | // 获得租户对应的数据源配置 |
| | | TenantDataSourceConfigRespDTO dataSourceConfig = tenantApi.getTenantDataSourceConfig(id); |
| | | if (dataSourceConfig == null) { |
| | | return null; |
| | | } |
| | | // 转换成 dynamic-datasource 配置 |
| | | // return new DataSourceProperty() |
| | | // .setPoolName(dataSourceConfig.getName()).setUrl(dataSourceConfig.getUrl()) |
| | | // .setUsername(dataSourceConfig.getUsername()).setPassword(dataSourceConfig.getPassword()); |
| | | |
| | | DataSourceProperty ds = new DataSourceProperty(); |
| | | ds.setPoolName(dataSourceConfig.getName()); |
| | | ds.setUrl(dataSourceConfig.getUrl()); |
| | | ds.setUsername(dataSourceConfig.getUsername()); |
| | | ds.setPassword(dataSourceConfig.getPassword()); |
| | | return ds; |
| | | } |
| | | |
| | | }); |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public List<Long> getTenantIds() { |
| | | return getTenantIdsCache.get(Boolean.TRUE); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void validTenant(Long id) { |
| | | validTenantCache.get(id).checkError(); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public DataSourceProperty getDataSourceProperty(Long id) { |
| | | return dataSourcePropertyCache.get(id); |
| | | } |
| | | } |