@@ -17,14 +17,12 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import org.springframework.http.converter.HttpMessageConverter; | import org.springframework.http.converter.HttpMessageConverter; | ||||
import org.springframework.http.converter.StringHttpMessageConverter; | import org.springframework.http.converter.StringHttpMessageConverter; | ||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; | |||||
import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||
import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.concurrent.ThreadPoolExecutor; | |||||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||
/** | /** | ||||
@@ -55,7 +53,7 @@ public class BeanConfig { | |||||
converterList.remove(converterTarget); | converterList.remove(converterTarget); | ||||
} | } | ||||
HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); | HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); | ||||
converterList.add(1,converter); | |||||
converterList.add(1, converter); | |||||
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); | MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); | ||||
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList( | mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList( | ||||
@@ -4,8 +4,8 @@ import cn.hutool.core.date.StopWatch; | |||||
import cn.hutool.core.util.RandomUtil; | import cn.hutool.core.util.RandomUtil; | ||||
import cn.hutool.system.oshi.OshiUtil; | import cn.hutool.system.oshi.OshiUtil; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; | |||||
import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||
import org.springframework.context.annotation.Profile; | |||||
import org.springframework.lang.NonNull; | import org.springframework.lang.NonNull; | ||||
import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||
@@ -25,16 +25,21 @@ import java.util.stream.Stream; | |||||
* @since 20:30 2024/3/5 | * @since 20:30 2024/3/5 | ||||
*/ | */ | ||||
@Slf4j | @Slf4j | ||||
@Profile("prod") | |||||
@Configuration | @Configuration | ||||
@ConditionalOnExpression("${cpu-load-task.open:false}") | |||||
public class CpuLoadTask { | public class CpuLoadTask { | ||||
private static final int LIMIT_COUNT = 2000000000; | |||||
private final AtomicInteger taskNo = new AtomicInteger(0); | |||||
public CpuLoadTask() { | |||||
CpuLoadThreadFactory threadFactory = new CpuLoadThreadFactory(Thread.MIN_PRIORITY); | |||||
fixedThreadPool = Executors.newFixedThreadPool(1, threadFactory); | |||||
} | |||||
private final ExecutorService fixedThreadPool; | |||||
private static final Integer CPU_LIMIT = 20; | private static final Integer CPU_LIMIT = 20; | ||||
private static final int LIMIT_COUNT = 1000000000; | |||||
private final AtomicInteger taskNo = new AtomicInteger(0); | |||||
private static final ExecutorService FIXED_THREAD_POOL; | |||||
private static class CpuLoadThreadFactory implements ThreadFactory { | private static class CpuLoadThreadFactory implements ThreadFactory { | ||||
@@ -53,13 +58,6 @@ public class CpuLoadTask { | |||||
} | } | ||||
static { | |||||
int logicalProcessorCount = OshiUtil.getProcessor().getLogicalProcessorCount(); | |||||
int max = Math.max(logicalProcessorCount * CPU_LIMIT / 100, 1); | |||||
CpuLoadThreadFactory threadFactory = new CpuLoadThreadFactory(Thread.MIN_PRIORITY); | |||||
FIXED_THREAD_POOL = Executors.newFixedThreadPool(max, threadFactory); | |||||
} | |||||
@Scheduled(fixedRate = 1, timeUnit = TimeUnit.MINUTES) | @Scheduled(fixedRate = 1, timeUnit = TimeUnit.MINUTES) | ||||
public void run() { | public void run() { | ||||
@@ -67,7 +65,7 @@ public class CpuLoadTask { | |||||
log.info("当前CPU使用率:{}", cpuUsage); | log.info("当前CPU使用率:{}", cpuUsage); | ||||
if (cpuUsage < CPU_LIMIT) { | if (cpuUsage < CPU_LIMIT) { | ||||
log.info("提交计算任务:{}", taskNo.incrementAndGet()); | log.info("提交计算任务:{}", taskNo.incrementAndGet()); | ||||
FIXED_THREAD_POOL.execute(() -> { | |||||
fixedThreadPool.execute(() -> { | |||||
StopWatch watch = new StopWatch(); | StopWatch watch = new StopWatch(); | ||||
watch.start(); | watch.start(); | ||||
long sum = Stream.generate(() -> RandomUtil.randomLong(1, LIMIT_COUNT)) | long sum = Stream.generate(() -> RandomUtil.randomLong(1, LIMIT_COUNT)) | ||||
@@ -1,5 +1,6 @@ | |||||
package com.hz.pm.api.common.statemachine.util; | package com.hz.pm.api.common.statemachine.util; | ||||
import cn.hutool.core.util.ObjUtil; | |||||
import com.hz.pm.api.common.statemachine.builder.impl.TenderStateMachineBuilderImpl; | import com.hz.pm.api.common.statemachine.builder.impl.TenderStateMachineBuilderImpl; | ||||
import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent; | import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent; | ||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | import com.hz.pm.api.projectdeclared.model.entity.Purchase; | ||||
@@ -7,6 +8,7 @@ import com.hz.pm.api.projectdeclared.utils.ProjectIdCodeCacheUtil; | |||||
import com.hz.pm.api.projectlib.entity.PurchaseStatusChange; | import com.hz.pm.api.projectlib.entity.PurchaseStatusChange; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; | import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; | ||||
import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; | import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; | ||||
import com.ningdatech.basic.exception.BizException; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.messaging.Message; | import org.springframework.messaging.Message; | ||||
@@ -64,6 +66,10 @@ public class TenderStateMachineUtil implements AbstractStateMachineUtil<Purchase | |||||
stateMachine.sendEvent(message); | stateMachine.sendEvent(message); | ||||
change.setAfterStatus(purchase.getStatus()); | change.setAfterStatus(purchase.getStatus()); | ||||
purchaseStatusChangeService.save(change); | purchaseStatusChangeService.save(change); | ||||
if (ObjUtil.equal(change.getBeforeStatus(), change.getBeforeStatus())) { | |||||
log.error("状态变更失败:{} {}", purchase, event); | |||||
throw BizException.wrap("状态变更失败"); | |||||
} | |||||
log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | ||||
} | } | ||||
@@ -180,8 +180,8 @@ public class PurchaseManage { | |||||
query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE + | query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE + | ||||
" and np.status = {0} ", req.getTabStatus()); | " and np.status = {0} ", req.getTabStatus()); | ||||
} else if (TenderMainStatus.PURCHASE_FINISHED.eq(req.getTabStatus())) { | } else if (TenderMainStatus.PURCHASE_FINISHED.eq(req.getTabStatus())) { | ||||
query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE + | |||||
" and npsc.event = {0} ", TenderStateChangeEvent.SUBMIT_PURCHASE_CONSTRUCTION_INFO); | |||||
query.exists(ExistsSqlConst.PROJECT_EXISTS_STATUS_CHANGE + | |||||
" and npsc.event = {0} ", ProjectStateChangeEvent.SUBMIT_PURCHASE_CONTRACT_RECORD); | |||||
} else if (ProjectStatus.TO_BE_PURCHASED.eq(req.getTabStatus())) { | } else if (ProjectStatus.TO_BE_PURCHASED.eq(req.getTabStatus())) { | ||||
query.eq(Project::getStatus, ProjectStatus.TO_BE_PURCHASED.getCode()); | query.eq(Project::getStatus, ProjectStatus.TO_BE_PURCHASED.getCode()); | ||||
} else { | } else { | ||||