修改 Id.next() 以及springcontextholer
This commit is contained in:
parent
aaacb48729
commit
03cde7f590
|
|
@ -1,51 +0,0 @@
|
|||
package com.bonus.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.DisposableBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.context.ApplicationEvent;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@Lazy(false)
|
||||
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
|
||||
private static final Logger log = LoggerFactory.getLogger(SpringContextHolder.class);
|
||||
private static ApplicationContext applicationContext = null;
|
||||
|
||||
public static ApplicationContext getApplicationContext() {
|
||||
return applicationContext;
|
||||
}
|
||||
|
||||
public void setApplicationContext(ApplicationContext applicationContext) {
|
||||
SpringContextHolder.applicationContext = applicationContext;
|
||||
}
|
||||
|
||||
public static <T> T getBean(String name) {
|
||||
return (T) applicationContext.getBean(name);
|
||||
}
|
||||
|
||||
public static <T> T getBean(Class<T> requiredType) {
|
||||
return applicationContext.getBean(requiredType);
|
||||
}
|
||||
|
||||
public static void clearHolder() {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("清除SpringContextHolder中的ApplicationContext:" + String.valueOf(applicationContext));
|
||||
}
|
||||
|
||||
applicationContext = null;
|
||||
}
|
||||
|
||||
public static void publishEvent(ApplicationEvent event) {
|
||||
if (applicationContext != null) {
|
||||
applicationContext.publishEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
clearHolder();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.bonus.utils;
|
||||
package com.bonus.utils.id;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
|
|
@ -13,11 +13,11 @@ public class Id {
|
|||
private static final long SEQUENCE_MASK = 4095L;
|
||||
private static final long WORKER_ID_LEFT_SHIFT_BITS = 12L;
|
||||
private static final long TIMESTAMP_LEFT_SHIFT_BITS = 22L;
|
||||
static long WORKER_ID;
|
||||
static Long WORKER_ID;
|
||||
private static long SEQUENCE;
|
||||
private static long LAST_TIME;
|
||||
|
||||
public Id(long workerId) {
|
||||
public Id(Long workerId) {
|
||||
WORKER_ID = workerId;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package com.bonus.utils.id;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
|
||||
@ConfigurationProperties(
|
||||
prefix = "id"
|
||||
)
|
||||
public class IdProperties {
|
||||
public static final String PREFIX = "id";
|
||||
private Boolean enabled = true;
|
||||
private String key = "worker_id_sequence";
|
||||
private String workspace;
|
||||
|
||||
public Boolean getEnabled() {
|
||||
return this.enabled;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
public String getWorkspace() {
|
||||
return this.workspace;
|
||||
}
|
||||
|
||||
public void setEnabled(final Boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public void setKey(final String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public void setWorkspace(final String workspace) {
|
||||
this.workspace = workspace;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
package com.bonus.utils.id;
|
||||
|
||||
import cn.hutool.core.text.CharSequenceUtil;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.FileLock;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collection;
|
||||
import java.util.UUID;
|
||||
|
||||
@Component
|
||||
@ConditionalOnClass({StringRedisTemplate.class})
|
||||
@EnableConfigurationProperties({IdProperties.class})
|
||||
@ConditionalOnProperty(
|
||||
prefix = "id",
|
||||
name = {"enabled"},
|
||||
havingValue = "true",
|
||||
matchIfMissing = true
|
||||
)
|
||||
public class IdWorkConfiguration {
|
||||
private static final Logger log = LoggerFactory.getLogger(IdWorkConfiguration.class);
|
||||
private final IdProperties idProperties;
|
||||
|
||||
public IdWorkConfiguration(StringRedisTemplate redisTemplate, IdProperties idProperties) throws IOException {
|
||||
this.idProperties = idProperties;
|
||||
Long workerId = this.getLocalWorkId();
|
||||
|
||||
try {
|
||||
while(workerId == null) {
|
||||
Long newWorkId = redisTemplate.opsForValue().increment(idProperties.getKey(), 1L);
|
||||
this.saveLocalWorkId(String.valueOf(newWorkId));
|
||||
workerId = this.getLocalWorkId();
|
||||
}
|
||||
} catch (Throwable var5) {
|
||||
log.error("获取workID失败", var5);
|
||||
throw var5;
|
||||
}
|
||||
|
||||
if (workerId > 1024L) {
|
||||
throw new RuntimeException("超过最大启动实例");
|
||||
} else {
|
||||
Id.WORKER_ID = workerId;
|
||||
}
|
||||
}
|
||||
|
||||
private void saveLocalWorkId(String workId) throws IOException {
|
||||
File workIdHome = this.getWorkIdHome();
|
||||
String var10002 = String.valueOf(workIdHome.getAbsoluteFile());
|
||||
FileUtils.writeStringToFile(new File(var10002 + "/" + String.valueOf(UUID.randomUUID()) + ".lock"), workId, StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
private File getWorkIdHome() {
|
||||
String workHome = this.idProperties.getWorkspace();
|
||||
if (CharSequenceUtil.isBlank(workHome)) {
|
||||
workHome = FileUtils.getUserDirectoryPath() + "/.workId/";
|
||||
}
|
||||
|
||||
String var10002 = CharSequenceUtil.removeSuffix(workHome, "/");
|
||||
return new File(var10002 + "/" + this.idProperties.getKey());
|
||||
}
|
||||
|
||||
private Long getLocalWorkId() throws IOException {
|
||||
File workIdHome = this.getWorkIdHome();
|
||||
if (!workIdHome.exists()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Collection<File> files = FileUtils.listFiles(workIdHome, new String[]{"lock"}, false);
|
||||
if (CollectionUtils.isEmpty(files)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (File file : files) {
|
||||
FileChannel channel = null;
|
||||
FileLock fileLock = null;
|
||||
|
||||
try {
|
||||
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
|
||||
channel = randomAccessFile.getChannel();
|
||||
fileLock = channel.tryLock();
|
||||
|
||||
if (fileLock != null) { // 成功获取文件锁
|
||||
Long workId = Long.valueOf(randomAccessFile.readLine());
|
||||
releaseResourcesOnShutdown(channel);
|
||||
return workId;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("Error accessing workId file", e);
|
||||
} finally {
|
||||
if (fileLock == null && channel != null) {
|
||||
try {
|
||||
channel.close();
|
||||
} catch (IOException e) {
|
||||
log.error("Failed to close file channel", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void releaseResourcesOnShutdown(FileChannel channel) {
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
try {
|
||||
channel.close();
|
||||
} catch (IOException e) {
|
||||
log.error("Release WorkId file lock error", e);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
package com.bonus.auth.controller;
|
||||
|
||||
import cn.hutool.core.text.CharSequenceUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.bonus.auth.mapper.AuthCustInfoMapper;
|
||||
import com.bonus.common.core.constant.CacheConstants;
|
||||
|
|
@ -16,7 +15,7 @@ import com.bonus.auth.mapper.AuthCustCasualMapper;
|
|||
import com.bonus.auth.service.*;
|
||||
import com.bonus.domain.SmsCodeVerifyDTO;
|
||||
import com.bonus.utils.AesEncryptUtil;
|
||||
import com.bonus.utils.Id;
|
||||
import com.bonus.utils.id.Id;
|
||||
import com.bonus.utils.SM4EncryptUtils;
|
||||
import com.bonus.common.core.domain.R;
|
||||
import com.bonus.common.core.exception.ServiceException;
|
||||
|
|
|
|||
|
|
@ -1,25 +1,12 @@
|
|||
package com.bonus.core.account.v3.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.text.CharSequenceUtil;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.bonus.common.core.exception.ServiceException;
|
||||
import com.bonus.constant.LeConstants;
|
||||
import com.bonus.core.account.v3.api.vo.AccInfoDetailVO;
|
||||
import com.bonus.core.account.v3.constants.AccStatusEnum;
|
||||
import com.bonus.core.account.v3.mapper.AccInfoMapper;
|
||||
import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum;
|
||||
import com.bonus.core.account.v3.model.AccInfo;
|
||||
|
|
@ -31,17 +18,9 @@ import com.bonus.core.account.v3.web.vo.AccInfoVO;
|
|||
import com.bonus.core.account.v3.web.vo.AccWalletInfoVO;
|
||||
import com.bonus.core.account.v4.api.CardInfoServiceV4Api;
|
||||
import com.bonus.core.account.v4.web.model.AccCard;
|
||||
import com.bonus.core.common.redis.RedisUtil;
|
||||
import com.bonus.core.common.utils.TenantContextHolder;
|
||||
import com.bonus.utils.Id;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.page.PageMethod;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.core.task.AsyncTaskExecutor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
package com.bonus.core.common.utils;
|
||||
|
||||
import com.bonus.utils.id.IdWorkConfiguration;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
@Configuration
|
||||
@Import({IdWorkConfiguration.class})
|
||||
public class CommonConfiguration {
|
||||
}
|
||||
|
|
@ -3,7 +3,6 @@ package com.bonus.core.menu.service.impl;
|
|||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.bonus.common.core.exception.ServiceException;
|
||||
|
|
@ -24,9 +23,8 @@ import com.bonus.core.menu.mapper.MenuAppRecipeMapper;
|
|||
import com.bonus.core.menu.vo.AppletWeekCanteenVO;
|
||||
import com.bonus.core.menu.vo.AppletWeekRecipeVO;
|
||||
import com.bonus.domain.CustInfo;
|
||||
import com.bonus.utils.Id;
|
||||
import com.bonus.utils.id.Id;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
|
|||
|
|
@ -10,9 +10,4 @@ public enum OrderIndexType {
|
|||
ROOM_ID_ORDER_DATE,
|
||||
ORDER_TYPE_ORDER_DATE,
|
||||
CANTEEN_ID_STALL_ID_MEALTIME_ORDER_TYPE_ORDER_DATE;
|
||||
|
||||
// $FF: synthetic method
|
||||
private static OrderIndexType[] $values() {
|
||||
return new OrderIndexType[]{MAC_ORDER_ID, ORDER_DATE, ORDER_TIME, PAY_TIME, CUST_ID_ORDER_DATE, MACHINE_SN_ORDER_DATE, ROOM_ID_ORDER_DATE, ORDER_TYPE_ORDER_DATE, CANTEEN_ID_STALL_ID_MEALTIME_ORDER_TYPE_ORDER_DATE};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ import com.bonus.core.allocation.canteen.service.AllocCanteenService;
|
|||
import com.bonus.core.allocation.canteen.service.AllocStallService;
|
||||
import com.bonus.core.common.enums.AllocCanteenTypeEnum;
|
||||
import com.bonus.core.common.enums.AllocMealtimeTypeEnum;
|
||||
import com.bonus.core.common.utils.SpringContextHolder;
|
||||
import com.bonus.core.order.common.constants.OrderTypeEnum;
|
||||
import com.bonus.utils.SpringContextHolder;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
|
|
|||
Reference in New Issue