refactor: merge develop
This commit is contained in:
commit
87a32a926b
@ -18,19 +18,46 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.client;
|
package com.alibaba.nacos.client;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.NacosFactory;
|
||||||
|
import com.alibaba.nacos.api.PropertyKeyConst;
|
||||||
import com.alibaba.nacos.api.config.ConfigService;
|
import com.alibaba.nacos.api.config.ConfigService;
|
||||||
|
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:liaochuntao@live.com">liaochuntao</a>
|
* @author <a href="mailto:liaochuntao@live.com">liaochuntao</a>
|
||||||
*/
|
*/
|
||||||
|
@Ignore
|
||||||
public class ConfigTest {
|
public class ConfigTest {
|
||||||
|
|
||||||
private ConfigService config7;
|
private ConfigService configService;
|
||||||
private ConfigService config8;
|
|
||||||
private ConfigService config9;
|
|
||||||
|
|
||||||
public void test() {
|
@Before
|
||||||
|
public void before() throws Exception {
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.setProperty(PropertyKeyConst.NAMESPACE, "bebf0150-e1ea-47e2-81fe-6814caf2b952");
|
||||||
|
properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
|
||||||
|
properties.setProperty(PropertyKeyConst.USERNAME, "chuntaojun");
|
||||||
|
properties.setProperty(PropertyKeyConst.PASSWORD, "1017");
|
||||||
|
configService = NacosFactory.createConfigService(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
final String dataId = "lessspring";
|
||||||
|
final String group = "lessspring";
|
||||||
|
final String content = "lessspring-" + System.currentTimeMillis();
|
||||||
|
boolean result = configService.publishConfig(dataId, group, content);
|
||||||
|
Assert.assertTrue(result);
|
||||||
|
|
||||||
|
ThreadUtils.sleep(10_000);
|
||||||
|
String response = configService.getConfig(dataId, group, 5000);
|
||||||
|
System.out.println(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,8 @@ public final class ThreadUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过内核数,算出合适的线程数;1.5-2倍cpu内核数
|
* Through the number of cores, calculate the appropriate number of threads;
|
||||||
|
* 1.5-2 times the number of CPU cores
|
||||||
*
|
*
|
||||||
* @return thread count
|
* @return thread count
|
||||||
*/
|
*/
|
||||||
|
@ -19,6 +19,7 @@ import com.alibaba.nacos.common.utils.IoUtils;
|
|||||||
import com.alibaba.nacos.common.utils.MD5Utils;
|
import com.alibaba.nacos.common.utils.MD5Utils;
|
||||||
import com.alibaba.nacos.common.utils.Observable;
|
import com.alibaba.nacos.common.utils.Observable;
|
||||||
import com.alibaba.nacos.common.utils.Observer;
|
import com.alibaba.nacos.common.utils.Observer;
|
||||||
|
import com.alibaba.nacos.common.utils.ThreadUtils;
|
||||||
import com.alibaba.nacos.config.server.constant.Constants;
|
import com.alibaba.nacos.config.server.constant.Constants;
|
||||||
import com.alibaba.nacos.config.server.manager.TaskManager;
|
import com.alibaba.nacos.config.server.manager.TaskManager;
|
||||||
import com.alibaba.nacos.config.server.model.ConfigInfo;
|
import com.alibaba.nacos.config.server.model.ConfigInfo;
|
||||||
@ -45,10 +46,10 @@ import com.alibaba.nacos.core.distributed.raft.exception.NoSuchRaftGroupExceptio
|
|||||||
import com.alibaba.nacos.core.utils.ApplicationUtils;
|
import com.alibaba.nacos.core.utils.ApplicationUtils;
|
||||||
import com.alibaba.nacos.core.utils.GlobalExecutor;
|
import com.alibaba.nacos.core.utils.GlobalExecutor;
|
||||||
import com.alibaba.nacos.core.utils.InetUtils;
|
import com.alibaba.nacos.core.utils.InetUtils;
|
||||||
|
import com.alibaba.nacos.core.utils.TimerContext;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
@ -65,6 +66,7 @@ import java.util.Random;
|
|||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static com.alibaba.nacos.config.server.utils.LogUtil.fatalLog;
|
import static com.alibaba.nacos.config.server.utils.LogUtil.fatalLog;
|
||||||
|
|
||||||
@ -84,8 +86,8 @@ public class DumpService {
|
|||||||
* Here you inject the dependent objects constructively, ensuring that some
|
* Here you inject the dependent objects constructively, ensuring that some
|
||||||
* of the dependent functionality is initialized ahead of time
|
* of the dependent functionality is initialized ahead of time
|
||||||
*
|
*
|
||||||
* @param persistService {@link PersistService}
|
* @param persistService {@link PersistService}
|
||||||
* @param memberManager {@link ServerMemberManager}
|
* @param memberManager {@link ServerMemberManager}
|
||||||
* @param protocolManager {@link ProtocolManager}
|
* @param protocolManager {@link ProtocolManager}
|
||||||
*/
|
*/
|
||||||
public DumpService(PersistService persistService, ServerMemberManager memberManager,
|
public DumpService(PersistService persistService, ServerMemberManager memberManager,
|
||||||
@ -103,12 +105,8 @@ public class DumpService {
|
|||||||
return memberManager;
|
return memberManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProtocolManager getProtocolManager() {
|
|
||||||
return protocolManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
protected void init() throws Exception {
|
protected void init() throws Throwable {
|
||||||
DynamicDataSource.getInstance().getDataSource();
|
DynamicDataSource.getInstance().getDataSource();
|
||||||
|
|
||||||
DumpProcessor processor = new DumpProcessor(this);
|
DumpProcessor processor = new DumpProcessor(this);
|
||||||
@ -132,6 +130,9 @@ public class DumpService {
|
|||||||
.info("With embedded distributed storage, you need to wait for "
|
.info("With embedded distributed storage, you need to wait for "
|
||||||
+ "the underlying master to complete before you can perform the dump operation.");
|
+ "the underlying master to complete before you can perform the dump operation.");
|
||||||
|
|
||||||
|
AtomicReference<Throwable> errorReference = new AtomicReference<>(null);
|
||||||
|
CountDownLatch waitDumpFinish = new CountDownLatch(1);
|
||||||
|
|
||||||
// watch path => /nacos_config/leader/ has value ?
|
// watch path => /nacos_config/leader/ has value ?
|
||||||
Observer observer = new Observer() {
|
Observer observer = new Observer() {
|
||||||
|
|
||||||
@ -142,8 +143,16 @@ public class DumpService {
|
|||||||
if (Objects.isNull(arg)) {
|
if (Objects.isNull(arg)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor,
|
try {
|
||||||
dumpAllTagProcessor);
|
dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor,
|
||||||
|
dumpAllTagProcessor);
|
||||||
|
}
|
||||||
|
catch (Throwable ex) {
|
||||||
|
errorReference.set(ex);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
waitDumpFinish.countDown();
|
||||||
|
}
|
||||||
protocol.protocolMetaData()
|
protocol.protocolMetaData()
|
||||||
.unSubscribe(Constants.CONFIG_MODEL_RAFT_GROUP,
|
.unSubscribe(Constants.CONFIG_MODEL_RAFT_GROUP,
|
||||||
com.alibaba.nacos.consistency.cp.Constants.LEADER_META_DATA,
|
com.alibaba.nacos.consistency.cp.Constants.LEADER_META_DATA,
|
||||||
@ -156,116 +165,134 @@ public class DumpService {
|
|||||||
com.alibaba.nacos.consistency.cp.Constants.LEADER_META_DATA,
|
com.alibaba.nacos.consistency.cp.Constants.LEADER_META_DATA,
|
||||||
observer);
|
observer);
|
||||||
|
|
||||||
// When all dump is complete, allow the following flow
|
// We must wait for the dump task to complete the callback operation before
|
||||||
|
// continuing with the initialization
|
||||||
|
ThreadUtils.latchAwait(waitDumpFinish);
|
||||||
|
|
||||||
|
// If an exception occurs during the execution of the dump task, the exception
|
||||||
|
// needs to be thrown, triggering the node to start the failed process
|
||||||
|
final Throwable ex = errorReference.get();
|
||||||
|
if (Objects.nonNull(ex)) {
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor, dumpAllTagProcessor);
|
dumpOperate(processor, dumpAllProcessor, dumpAllBetaProcessor,
|
||||||
|
dumpAllTagProcessor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dumpOperate(DumpProcessor processor, DumpAllProcessor dumpAllProcessor,
|
private void dumpOperate(DumpProcessor processor, DumpAllProcessor dumpAllProcessor,
|
||||||
DumpAllBetaProcessor dumpAllBetaProcessor,
|
DumpAllBetaProcessor dumpAllBetaProcessor,
|
||||||
DumpAllTagProcessor dumpAllTagProcessor) {
|
DumpAllTagProcessor dumpAllTagProcessor) {
|
||||||
LogUtil.defaultLog.warn("DumpService start");
|
TimerContext.start("config dump job");
|
||||||
|
try {
|
||||||
|
LogUtil.defaultLog.warn("DumpService start");
|
||||||
|
|
||||||
Runnable dumpAll = () -> dumpAllTaskMgr
|
Runnable dumpAll = () -> dumpAllTaskMgr
|
||||||
.addTask(DumpAllTask.TASK_ID, new DumpAllTask());
|
.addTask(DumpAllTask.TASK_ID, new DumpAllTask());
|
||||||
|
|
||||||
Runnable dumpAllBeta = () -> dumpAllTaskMgr
|
Runnable dumpAllBeta = () -> dumpAllTaskMgr
|
||||||
.addTask(DumpAllBetaTask.TASK_ID, new DumpAllBetaTask());
|
.addTask(DumpAllBetaTask.TASK_ID, new DumpAllBetaTask());
|
||||||
|
|
||||||
Runnable clearConfigHistory = () -> {
|
Runnable clearConfigHistory = () -> {
|
||||||
log.warn("clearConfigHistory start");
|
log.warn("clearConfigHistory start");
|
||||||
if (canExecute()) {
|
if (canExecute()) {
|
||||||
try {
|
try {
|
||||||
Timestamp startTime = getBeforeStamp(TimeUtils.getCurrentTime(),
|
Timestamp startTime = getBeforeStamp(TimeUtils.getCurrentTime(),
|
||||||
24 * getRetentionDays());
|
24 * getRetentionDays());
|
||||||
int totalCount = persistService
|
int totalCount = persistService
|
||||||
.findConfigHistoryCountByTime(startTime);
|
.findConfigHistoryCountByTime(startTime);
|
||||||
if (totalCount > 0) {
|
if (totalCount > 0) {
|
||||||
int pageSize = 1000;
|
int pageSize = 1000;
|
||||||
int removeTime = (totalCount + pageSize - 1) / pageSize;
|
int removeTime = (totalCount + pageSize - 1) / pageSize;
|
||||||
log.warn(
|
log.warn(
|
||||||
"clearConfigHistory, getBeforeStamp:{}, totalCount:{}, pageSize:{}, removeTime:{}",
|
"clearConfigHistory, getBeforeStamp:{}, totalCount:{}, pageSize:{}, removeTime:{}",
|
||||||
new Object[] { startTime, totalCount, pageSize,
|
startTime, totalCount, pageSize, removeTime);
|
||||||
removeTime });
|
while (removeTime > 0) {
|
||||||
while (removeTime > 0) {
|
// 分页删除,以免批量太大报错
|
||||||
// 分页删除,以免批量太大报错
|
persistService.removeConfigHistory(startTime, pageSize);
|
||||||
persistService.removeConfigHistory(startTime, pageSize);
|
removeTime--;
|
||||||
removeTime--;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
catch (Throwable e) {
|
||||||
catch (Throwable e) {
|
log.error("clearConfigHistory error", e);
|
||||||
log.error("clearConfigHistory error", e);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
dumpConfigInfo(dumpAllProcessor);
|
|
||||||
|
|
||||||
// 更新beta缓存
|
|
||||||
LogUtil.defaultLog.info("start clear all config-info-beta.");
|
|
||||||
DiskUtil.clearAllBeta();
|
|
||||||
if (persistService.isExistTable(BETA_TABLE_NAME)) {
|
|
||||||
dumpAllBetaProcessor
|
|
||||||
.process(DumpAllBetaTask.TASK_ID, new DumpAllBetaTask());
|
|
||||||
}
|
|
||||||
// 更新Tag缓存
|
|
||||||
LogUtil.defaultLog.info("start clear all config-info-tag.");
|
|
||||||
DiskUtil.clearAllTag();
|
|
||||||
if (persistService.isExistTable(TAG_TABLE_NAME)) {
|
|
||||||
dumpAllTagProcessor.process(DumpAllTagTask.TASK_ID, new DumpAllTagTask());
|
|
||||||
}
|
|
||||||
|
|
||||||
// add to dump aggr
|
|
||||||
List<ConfigInfoChanged> configList = persistService.findAllAggrGroup();
|
|
||||||
if (configList != null && !configList.isEmpty()) {
|
|
||||||
total = configList.size();
|
|
||||||
List<List<ConfigInfoChanged>> splitList = splitList(configList,
|
|
||||||
INIT_THREAD_COUNT);
|
|
||||||
for (List<ConfigInfoChanged> list : splitList) {
|
|
||||||
MergeAllDataWorker work = new MergeAllDataWorker(list);
|
|
||||||
work.start();
|
|
||||||
}
|
|
||||||
log.info("server start, schedule merge end.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
LogUtil.fatalLog
|
|
||||||
.error("Nacos Server did not start because dumpservice bean construction failure :\n"
|
|
||||||
+ e.getMessage(), e.getCause());
|
|
||||||
throw new RuntimeException(
|
|
||||||
"Nacos Server did not start because dumpservice bean construction failure :\n"
|
|
||||||
+ e.getMessage());
|
|
||||||
}
|
|
||||||
if (!ApplicationUtils.getStandaloneMode()) {
|
|
||||||
Runnable heartbeat = () -> {
|
|
||||||
String heartBeatTime = TimeUtils.getCurrentTime().toString();
|
|
||||||
// write disk
|
|
||||||
try {
|
|
||||||
DiskUtil.saveHeartBeatToDisk(heartBeatTime);
|
|
||||||
}
|
|
||||||
catch (IOException e) {
|
|
||||||
LogUtil.fatalLog.error("save heartbeat fail" + e.getMessage());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TimerTaskService.scheduleWithFixedDelay(heartbeat, 0, 10, TimeUnit.SECONDS);
|
try {
|
||||||
|
dumpConfigInfo(dumpAllProcessor);
|
||||||
|
|
||||||
long initialDelay = new Random().nextInt(INITIAL_DELAY_IN_MINUTE) + 10;
|
// 更新beta缓存
|
||||||
LogUtil.defaultLog.warn("initialDelay:{}", initialDelay);
|
LogUtil.defaultLog.info("start clear all config-info-beta.");
|
||||||
|
DiskUtil.clearAllBeta();
|
||||||
|
if (persistService.isExistTable(BETA_TABLE_NAME)) {
|
||||||
|
dumpAllBetaProcessor
|
||||||
|
.process(DumpAllBetaTask.TASK_ID, new DumpAllBetaTask());
|
||||||
|
}
|
||||||
|
// 更新Tag缓存
|
||||||
|
LogUtil.defaultLog.info("start clear all config-info-tag.");
|
||||||
|
DiskUtil.clearAllTag();
|
||||||
|
if (persistService.isExistTable(TAG_TABLE_NAME)) {
|
||||||
|
dumpAllTagProcessor
|
||||||
|
.process(DumpAllTagTask.TASK_ID, new DumpAllTagTask());
|
||||||
|
}
|
||||||
|
|
||||||
TimerTaskService.scheduleWithFixedDelay(dumpAll, initialDelay,
|
// add to dump aggr
|
||||||
DUMP_ALL_INTERVAL_IN_MINUTE, TimeUnit.MINUTES);
|
List<ConfigInfoChanged> configList = persistService.findAllAggrGroup();
|
||||||
|
if (configList != null && !configList.isEmpty()) {
|
||||||
|
total = configList.size();
|
||||||
|
List<List<ConfigInfoChanged>> splitList = splitList(configList,
|
||||||
|
INIT_THREAD_COUNT);
|
||||||
|
for (List<ConfigInfoChanged> list : splitList) {
|
||||||
|
MergeAllDataWorker work = new MergeAllDataWorker(list);
|
||||||
|
work.start();
|
||||||
|
}
|
||||||
|
log.info("server start, schedule merge end.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
LogUtil.fatalLog
|
||||||
|
.error("Nacos Server did not start because dumpservice bean construction failure :\n"
|
||||||
|
+ e.getMessage(), e.getCause());
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Nacos Server did not start because dumpservice bean construction failure :\n"
|
||||||
|
+ e.getMessage());
|
||||||
|
}
|
||||||
|
if (!ApplicationUtils.getStandaloneMode()) {
|
||||||
|
Runnable heartbeat = () -> {
|
||||||
|
String heartBeatTime = TimeUtils.getCurrentTime().toString();
|
||||||
|
// write disk
|
||||||
|
try {
|
||||||
|
DiskUtil.saveHeartBeatToDisk(heartBeatTime);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
LogUtil.fatalLog.error("save heartbeat fail" + e.getMessage());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
TimerTaskService.scheduleWithFixedDelay(dumpAllBeta, initialDelay,
|
TimerTaskService
|
||||||
DUMP_ALL_INTERVAL_IN_MINUTE, TimeUnit.MINUTES);
|
.scheduleWithFixedDelay(heartbeat, 0, 10, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
long initialDelay = new Random().nextInt(INITIAL_DELAY_IN_MINUTE) + 10;
|
||||||
|
LogUtil.defaultLog.warn("initialDelay:{}", initialDelay);
|
||||||
|
|
||||||
|
TimerTaskService.scheduleWithFixedDelay(dumpAll, initialDelay,
|
||||||
|
DUMP_ALL_INTERVAL_IN_MINUTE, TimeUnit.MINUTES);
|
||||||
|
|
||||||
|
TimerTaskService.scheduleWithFixedDelay(dumpAllBeta, initialDelay,
|
||||||
|
DUMP_ALL_INTERVAL_IN_MINUTE, TimeUnit.MINUTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
TimerTaskService
|
||||||
|
.scheduleWithFixedDelay(clearConfigHistory, 10, 10, TimeUnit.MINUTES);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
TimerContext.end(LogUtil.dumpLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerTaskService
|
|
||||||
.scheduleWithFixedDelay(clearConfigHistory, 10, 10, TimeUnit.MINUTES);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ public class DumpServiceTest {
|
|||||||
DumpService service;
|
DumpService service;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void init() throws Exception {
|
public void init() throws Throwable {
|
||||||
service.init();
|
service.init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,6 @@ public class StartingSpringApplicationRunListener
|
|||||||
@Override
|
@Override
|
||||||
public void started(ConfigurableApplicationContext context) {
|
public void started(ConfigurableApplicationContext context) {
|
||||||
starting = false;
|
starting = false;
|
||||||
|
|
||||||
ConfigurableEnvironment env = context.getEnvironment();
|
ConfigurableEnvironment env = context.getEnvironment();
|
||||||
|
|
||||||
closeExecutor();
|
closeExecutor();
|
||||||
@ -160,10 +159,10 @@ public class StartingSpringApplicationRunListener
|
|||||||
|
|
||||||
closeExecutor();
|
closeExecutor();
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
|
||||||
LOGGER.error("Nacos failed to start, please see {} for more details.",
|
LOGGER.error("Nacos failed to start, please see {} for more details.",
|
||||||
Paths.get(ApplicationUtils.getNacosHome(), "logs/nacos.log"));
|
Paths.get(ApplicationUtils.getNacosHome(), "logs/nacos.log"));
|
||||||
|
|
||||||
context.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.core.utils;
|
package com.alibaba.nacos.core.utils;
|
||||||
|
|
||||||
import com.alibaba.nacos.common.utils.LoggerUtils;
|
|
||||||
import com.alibaba.nacos.common.utils.Pair;
|
import com.alibaba.nacos.common.utils.Pair;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
@ -39,7 +38,7 @@ public class TimerContext {
|
|||||||
public static void end(final Logger logger) {
|
public static void end(final Logger logger) {
|
||||||
long endTime = System.currentTimeMillis();
|
long endTime = System.currentTimeMillis();
|
||||||
Pair<String, Long> record = TIME_RECORD.get();
|
Pair<String, Long> record = TIME_RECORD.get();
|
||||||
LoggerUtils.printIfDebugEnabled(logger, "{} cost time : {} ms", record.getFirst(), (endTime - record.getSecond()));
|
logger.info("{} cost time : {} ms", record.getFirst(), (endTime - record.getSecond()));
|
||||||
TIME_RECORD.remove();
|
TIME_RECORD.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user