id generate

This commit is contained in:
tanwenhai 2020-12-15 16:11:02 +08:00
parent be43839d73
commit e311e7c500
3 changed files with 51 additions and 27 deletions

View File

@ -2,6 +2,11 @@ package com.github.kfcfans.powerjob.server.persistence.core.repository;
import com.github.kfcfans.powerjob.server.persistence.core.model.ServerInfoDO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import javax.persistence.LockModeType;
import java.util.List;
/**
* 服务器信息 数据操作层
@ -11,4 +16,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
*/
public interface ServerInfoRepository extends JpaRepository<ServerInfoDO, Long> {
ServerInfoDO findByIp(String ip);
@Query("select t from ServerInfoDO as t order by t.id asc")
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<ServerInfoDO> findAllAndLockTable();
}

View File

@ -3,9 +3,23 @@ package com.github.kfcfans.powerjob.server.service.id;
import com.github.kfcfans.powerjob.common.utils.NetUtils;
import com.github.kfcfans.powerjob.server.persistence.core.model.ServerInfoDO;
import com.github.kfcfans.powerjob.server.persistence.core.repository.ServerInfoRepository;
import com.google.common.base.Throwables;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.Assert;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
/**
* 唯一ID生成服务使用 Twitter snowflake 算法
@ -24,20 +38,32 @@ public class IdGenerateService {
private static final int DATA_CENTER_ID = 0;
@Autowired
public IdGenerateService(ServerInfoRepository serverInfoRepository) {
public IdGenerateService(ServerInfoRepository serverInfoRepository,
@Qualifier("coreTransactionManager") PlatformTransactionManager platformTransactionManager) {
TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager);
// 服务频繁重启数据库id自增值过大使用表锁获取机器id
snowFlakeIdGenerator = transactionTemplate.execute(action -> {
List<ServerInfoDO> serverInfos = serverInfoRepository.findAllAndLockTable();
String ip = NetUtils.getLocalHost();
ServerInfoDO server = serverInfoRepository.findByIp(ip);
Long id = null;
if (server == null) {
ServerInfoDO newServerInfo = new ServerInfoDO(ip);
serverInfoRepository.saveAndFlush(newServerInfo);
id = serverInfos.size() + 1L;
} else {
for (int i = 0, len = serverInfos.size(); i < len; i++) {
if (Objects.equals(serverInfos.get(i).getId(), server.getId())) {
id = i + 1L;
break;
}
}
}
Assert.notNull(id, "[IdGenerateService] init snowflake error, id is null");
log.info("[IdGenerateService] init snowflake for server(address={}) by machineId({}).", ip, id);
String ip = NetUtils.getLocalHost();
ServerInfoDO server = serverInfoRepository.findByIp(ip);
if (server == null) {
ServerInfoDO newServerInfo = new ServerInfoDO(ip);
server = serverInfoRepository.saveAndFlush(newServerInfo);
}
Long id = server.getId();
snowFlakeIdGenerator = new SnowFlakeIdGenerator(DATA_CENTER_ID, id);
log.info("[IdGenerateService] init snowflake for server(address={}) by machineId({}).", ip, id);
return new SnowFlakeIdGenerator(DATA_CENTER_ID, id);
});
}
/**

View File

@ -3,28 +3,17 @@ logging.config=classpath:logback-dev.xml
####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=No1Bug2Please3!
spring.datasource.core.password=123456
spring.datasource.core.hikari.maximum-pool-size=20
spring.datasource.core.hikari.minimum-idle=5
####### mongoDB配置非核心依赖通过配置 oms.mongodb.enable=false 来关闭 #######
oms.mongodb.enable=true
oms.mongodb.enable=false
spring.data.mongodb.uri=mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority
####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
spring.mail.host=smtp.163.com
spring.mail.username=zqq@163.com
spring.mail.password=GOFZPNARMVKCGONV
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
####### 钉钉报警配置(不需要钉钉报警可以删除以下配置来避免报错) #######
oms.alarm.ding.app-key=dingauqwkvxxnqskknfv
oms.alarm.ding.app-secret=XWrEPdAZMPgJeFtHuL0LH73LRj-74umF2_0BFcoXMfvnX0pCQvt0rpb1JOJU_HLl
oms.alarm.ding.agent-id=847044348
####### 资源清理配置 #######
oms.instanceinfo.retention=1