/*
|
* Copyright (c) 2018-2028, DreamLu All rights reserved.
|
*
|
* Redistribution and use in source and binary forms, with or without
|
* modification, are permitted provided that the following conditions are met:
|
*
|
* Redistributions of source code must retain the above copyright notice,
|
* this list of conditions and the following disclaimer.
|
* Redistributions in binary form must reproduce the above copyright
|
* notice, this list of conditions and the following disclaimer in the
|
* documentation and/or other materials provided with the distribution.
|
* Neither the name of the dreamlu.net developer nor the names of its
|
* contributors may be used to endorse or promote products derived from
|
* this software without specific prior written permission.
|
* Author: DreamLu 卢春梦 (596392912@qq.com)
|
*/
|
|
package org.springblade.core.redis.lock;
|
|
import org.redisson.Redisson;
|
import org.redisson.api.RedissonClient;
|
import org.redisson.config.*;
|
import org.springblade.core.tool.utils.StringUtil;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.context.annotation.Bean;
|
|
/**
|
* 分布式锁自动化配置
|
*
|
* @author L.cm
|
*/
|
@AutoConfiguration
|
@ConditionalOnClass(RedissonClient.class)
|
@EnableConfigurationProperties(BladeLockProperties.class)
|
@ConditionalOnProperty(value = "blade.lock.enabled", havingValue = "true")
|
public class BladeLockAutoConfiguration {
|
|
private static Config singleConfig(BladeLockProperties properties) {
|
Config config = new Config();
|
SingleServerConfig serversConfig = config.useSingleServer();
|
serversConfig.setAddress(properties.getAddress());
|
String password = properties.getPassword();
|
if (StringUtil.isNotBlank(password)) {
|
serversConfig.setPassword(password);
|
}
|
serversConfig.setDatabase(properties.getDatabase());
|
serversConfig.setConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setIdleConnectionTimeout(properties.getConnectionTimeout());
|
serversConfig.setConnectTimeout(properties.getConnectionTimeout());
|
serversConfig.setTimeout(properties.getTimeout());
|
return config;
|
}
|
|
private static Config masterSlaveConfig(BladeLockProperties properties) {
|
Config config = new Config();
|
MasterSlaveServersConfig serversConfig = config.useMasterSlaveServers();
|
serversConfig.setMasterAddress(properties.getMasterAddress());
|
serversConfig.addSlaveAddress(properties.getSlaveAddress());
|
String password = properties.getPassword();
|
if (StringUtil.isNotBlank(password)) {
|
serversConfig.setPassword(password);
|
}
|
serversConfig.setDatabase(properties.getDatabase());
|
serversConfig.setMasterConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setMasterConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setSlaveConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setSlaveConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setIdleConnectionTimeout(properties.getConnectionTimeout());
|
serversConfig.setConnectTimeout(properties.getConnectionTimeout());
|
serversConfig.setTimeout(properties.getTimeout());
|
return config;
|
}
|
|
private static Config sentinelConfig(BladeLockProperties properties) {
|
Config config = new Config();
|
SentinelServersConfig serversConfig = config.useSentinelServers();
|
serversConfig.setMasterName(properties.getMasterName());
|
serversConfig.addSentinelAddress(properties.getSentinelAddress());
|
String password = properties.getPassword();
|
if (StringUtil.isNotBlank(password)) {
|
serversConfig.setPassword(password);
|
}
|
serversConfig.setDatabase(properties.getDatabase());
|
serversConfig.setMasterConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setMasterConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setSlaveConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setSlaveConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setIdleConnectionTimeout(properties.getConnectionTimeout());
|
serversConfig.setConnectTimeout(properties.getConnectionTimeout());
|
serversConfig.setTimeout(properties.getTimeout());
|
return config;
|
}
|
|
private static Config clusterConfig(BladeLockProperties properties) {
|
Config config = new Config();
|
ClusterServersConfig serversConfig = config.useClusterServers();
|
serversConfig.addNodeAddress(properties.getNodeAddress());
|
String password = properties.getPassword();
|
if (StringUtil.isNotBlank(password)) {
|
serversConfig.setPassword(password);
|
}
|
serversConfig.setMasterConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setMasterConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setSlaveConnectionPoolSize(properties.getPoolSize());
|
serversConfig.setSlaveConnectionMinimumIdleSize(properties.getIdleSize());
|
serversConfig.setIdleConnectionTimeout(properties.getConnectionTimeout());
|
serversConfig.setConnectTimeout(properties.getConnectionTimeout());
|
serversConfig.setTimeout(properties.getTimeout());
|
return config;
|
}
|
|
@Bean
|
@ConditionalOnMissingBean
|
public RedisLockClient redisLockClient(BladeLockProperties properties) {
|
return new RedisLockClientImpl(redissonClient(properties));
|
}
|
|
@Bean
|
@ConditionalOnMissingBean
|
public RedisLockAspect redisLockAspect(RedisLockClient redisLockClient) {
|
return new RedisLockAspect(redisLockClient);
|
}
|
|
private static RedissonClient redissonClient(BladeLockProperties properties) {
|
BladeLockProperties.Mode mode = properties.getMode();
|
Config config;
|
switch (mode) {
|
case sentinel:
|
config = sentinelConfig(properties);
|
break;
|
case cluster:
|
config = clusterConfig(properties);
|
break;
|
case master:
|
config = masterSlaveConfig(properties);
|
break;
|
case single:
|
config = singleConfig(properties);
|
break;
|
default:
|
config = new Config();
|
break;
|
}
|
return Redisson.create(config);
|
}
|
|
}
|