diff --git a/capability/src/main/java/com/sdm/capability/config/RedisConfig.java b/capability/src/main/java/com/sdm/capability/config/RedisConfig.java index 32246500..8fa01176 100644 --- a/capability/src/main/java/com/sdm/capability/config/RedisConfig.java +++ b/capability/src/main/java/com/sdm/capability/config/RedisConfig.java @@ -1,45 +1,45 @@ -package com.sdm.capability.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - +//package com.sdm.capability.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +//@Configuration +//public class RedisConfig { +// +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } +// +// @Bean(name = "bytesRedisTemplate") +// public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// redisTemplate.setConnectionFactory(connectionFactory); +// // 设置key和value的序列化规则 +// redisTemplate.setValueSerializer(RedisSerializer.byteArray()); +// redisTemplate.setKeySerializer(new StringRedisSerializer()); +// redisTemplate.afterPropertiesSet(); +// +// return redisTemplate; +// } +//} +// +// +// diff --git a/common/pom.xml b/common/pom.xml index f6a064db..c4f4e151 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -77,6 +77,12 @@ provided + + org.apache.httpcomponents + httpclient + 4.5.14 + + diff --git a/common/src/main/java/com/sdm/common/common/SpdmRedisKeyEnum.java b/common/src/main/java/com/sdm/common/common/SpdmRedisKeyEnum.java new file mode 100644 index 00000000..7ed68dea --- /dev/null +++ b/common/src/main/java/com/sdm/common/common/SpdmRedisKeyEnum.java @@ -0,0 +1,32 @@ +package com.sdm.common.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum SpdmRedisKeyEnum { + /** + * 场景:测试1(有效期:2小时) + */ + YANG_TEST1("yang:test1:%s", 2 * 60 * 60), + + /** + * 场景:测试2(永久有效) + */ + YANG_TEST2("yang:test2:%s", -1); + + + + /** + * key 模板 + */ + private final String key; + + /** + * 过期时间(秒) -1 表示永久有效 + */ + private final int expire; + + +} diff --git a/common/src/main/java/com/sdm/common/config/RedisConfig.java b/common/src/main/java/com/sdm/common/config/RedisConfig.java new file mode 100644 index 00000000..18aa8d54 --- /dev/null +++ b/common/src/main/java/com/sdm/common/config/RedisConfig.java @@ -0,0 +1,70 @@ +package com.sdm.common.config; + +import com.alibaba.fastjson2.support.spring6.data.redis.GenericFastJsonRedisSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + + /** + * 自定义RedisTemplate,使用FASTJSON序列化 + */ + @Bean(name = "spdmRedisTemplate") + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(factory); + // String类型key序列化 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // fastJSON类型value序列化 + GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); + // key采用String序列化 + redisTemplate.setKeySerializer(stringRedisSerializer); + // hash的key也采用String序列化 + redisTemplate.setHashKeySerializer(stringRedisSerializer); + // value序列化采用JSON + redisTemplate.setValueSerializer(fastJsonRedisSerializer); + redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } + + @Bean(name = "bytesRedisTemplate") + public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(connectionFactory); + // 设置key和value的序列化规则 + redisTemplate.setValueSerializer(RedisSerializer.byteArray()); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.afterPropertiesSet(); + + return redisTemplate; + } +} + + + diff --git a/common/src/main/java/com/sdm/common/utils/HpcCommandExcuteUtil.java b/common/src/main/java/com/sdm/common/utils/HpcCommandExcuteUtil.java index bca2844b..1632556b 100644 --- a/common/src/main/java/com/sdm/common/utils/HpcCommandExcuteUtil.java +++ b/common/src/main/java/com/sdm/common/utils/HpcCommandExcuteUtil.java @@ -10,12 +10,16 @@ import com.sdm.common.entity.resp.pbs.hpc.FileNodeInfo; import com.sdm.common.log.CoreLogger; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -30,7 +34,6 @@ import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; -import java.nio.channels.Channels; import java.nio.charset.StandardCharsets; import java.util.*; @@ -157,33 +160,48 @@ public class HpcCommandExcuteUtil { return nodeInfos; } - public ResponseEntity hpcDownloadFile(String path, Long fileSize,WebClient pbsWebClient) { + public ResponseEntity hpcDownloadFile(String path) { String fileName = extractFileName(path); String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); StreamingResponseBody body = outputStream -> { - // 构建完整 URL,并安全编码 path String url = remoteDownLoadFileUrl + "?path=" + URLEncoder.encode(path, StandardCharsets.UTF_8); - // 调用 B 服务并流式写出 - DataBufferUtils.write( - pbsWebClient.get() - .uri(url) - .retrieve() - .bodyToFlux(DataBuffer.class), - Channels.newChannel(outputStream) - ).blockLast(); + // 超时 24 小时 + RequestConfig config = RequestConfig.custom() + .setSocketTimeout(86400000) + .setConnectTimeout(30000) + .build(); + + HttpGet httpGet = new HttpGet(url); + httpGet.setConfig(config); + + try (CloseableHttpClient client = HttpClientBuilder.create().build(); + CloseableHttpResponse resp = client.execute(httpGet)) { + + HttpEntity entity = resp.getEntity(); + if (entity == null) return; + + try (BufferedInputStream in = new BufferedInputStream(entity.getContent())) { + byte[] buffer = new byte[8192]; + int len; + while ((len = in.read(buffer)) != -1) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + } + } catch (Exception ignored) { + log.error("hpcDownloadFile error,url:{},errMsg:{}", url, ignored.getMessage()); + } }; - ResponseEntity.BodyBuilder builder = ResponseEntity.ok() + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName) - .contentType(MediaType.APPLICATION_OCTET_STREAM); - - if (fileSize != null && fileSize > 0) { - builder.contentLength(fileSize); - } - - return builder.body(body); + .header("Connection", "keep-alive") +// .header("Transfer-Encoding", "chunked") + .header("Cache-Control", "no-cache") + .body(body); } public SdmResponse callHpcUploadToTarget(String jobId, String workDir,String minioBucket, diff --git a/common/src/main/java/com/sdm/common/utils/SpdmRedisUtil.java b/common/src/main/java/com/sdm/common/utils/SpdmRedisUtil.java new file mode 100644 index 00000000..7344c81c --- /dev/null +++ b/common/src/main/java/com/sdm/common/utils/SpdmRedisUtil.java @@ -0,0 +1,377 @@ +package com.sdm.common.utils; + +import com.sdm.common.common.SpdmRedisKeyEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * 基于spring和redis的redis工具类 + * 针对所有的hash 都是以h开头的方法 + * 针对所有的Set 都是以s开头的方法 不含通用方法 + * 针对所有的List 都是以l开头的方法 + */ +@Component +@Slf4j +public class SpdmRedisUtil { + + public static final String REDIS_KEY_SEPARATOR = ":"; + + @Autowired + @Qualifier("spdmRedisTemplate") + private RedisTemplate redisTemplate; + + // redis key 的前缀 + @Value("${spring.profiles.active:}") + private String keyPrefixEnv; + + // ==================== 核心:根据枚举生成真实 KEY ==================== + private String getRealKey(SpdmRedisKeyEnum keyEnum, Object... params) { + String format = String.format(keyEnum.getKey(), params); + return keyPrefixEnv + REDIS_KEY_SEPARATOR+format; + } + + // ==================== 1. 公共通用方法 ==================== + + /** + * 指定缓存失效时间(使用枚举自带过期时间) + */ + public boolean expire(SpdmRedisKeyEnum keyEnum, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + int expire = keyEnum.getExpire(); + if (expire > 0) { + redisTemplate.expire(realKey, expire, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + log.error("redis设置过期时间异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + /** + * 根据key获取过期时间(秒) + * 0 = 永久有效 + */ + public long getExpire(SpdmRedisKeyEnum keyEnum, Object... params) { + String realKey = getRealKey(keyEnum, params); + Long expire = redisTemplate.getExpire(realKey, TimeUnit.SECONDS); + return expire == null ? -2 : expire; + } + + /** + * 判断key是否存在 + */ + public boolean hasKey(SpdmRedisKeyEnum keyEnum, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + return Boolean.TRUE.equals(redisTemplate.hasKey(realKey)); + } catch (Exception e) { + log.error("redis判断key是否存在异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + /** + * 删除缓存(支持单个/多个枚举key) + */ + public void del(SpdmRedisKeyEnum... keyEnums) { + for (SpdmRedisKeyEnum keyEnum : keyEnums) { + del(keyEnum, new Object[0]); + } + } + + public void del(SpdmRedisKeyEnum keyEnum, Object... params) { + String realKey = getRealKey(keyEnum, params); + try { + redisTemplate.delete(realKey); + } catch (Exception e) { + log.error("redis删除key异常!key:{}", realKey, e); + } + } + + // ==================== 2. String 类型 ==================== + + /** + * 普通缓存放入(自动使用枚举过期时间) + * Pair<是否成功,真实key> + */ + public Pair set(SpdmRedisKeyEnum keyEnum, Object value, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + int expire = keyEnum.getExpire(); + if (expire > 0) { + redisTemplate.opsForValue().set(realKey, value, expire, TimeUnit.SECONDS); + } else { + redisTemplate.opsForValue().set(realKey, value); + } + return Pair.of(true, realKey); + } catch (Exception e) { + log.error("redis字符串存入异常!key:{}", getRealKey(keyEnum, params), e); + return Pair.of(false, ""); + } + } + + /** + * 普通缓存获取 + */ + public Object get(SpdmRedisKeyEnum keyEnum, Object... params) { + String realKey = getRealKey(keyEnum, params); + return redisTemplate.opsForValue().get(realKey); + } + + /** + * 获取Java对象(自动反序列化) + */ + public T getBean(SpdmRedisKeyEnum keyEnum, Class clazz, Object... params) { + String realKey = getRealKey(keyEnum, params); + Object obj = redisTemplate.opsForValue().get(realKey); + if (obj == null) return null; + // 校验对象类型是否匹配 + if (!clazz.isInstance(obj)) { + log.warn("Redis缓存对象类型不匹配,期望:{},实际:{},redis key:{}",clazz.getName(),obj.getClass().getName(),realKey); + return null; + } + return clazz.cast(obj); + } + + /** + * 递增 + */ + public long incr(SpdmRedisKeyEnum keyEnum, long delta, Object... params) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + String realKey = getRealKey(keyEnum, params); + Long increment = redisTemplate.opsForValue().increment(realKey, delta); + return increment == null ? 0 : increment; + } + + /** + * 递减 + */ + public long decr(SpdmRedisKeyEnum keyEnum, long delta, Object... params) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + String realKey = getRealKey(keyEnum, params); + Long increment = redisTemplate.opsForValue().increment(realKey, -delta); + return increment == null ? 0 : increment; + } + + // ==================== 3. Hash 类型 ==================== + + public Object hget(SpdmRedisKeyEnum keyEnum, String item, Object... params) { + return redisTemplate.opsForHash().get(getRealKey(keyEnum, params), item); + } + + public Map hmget(SpdmRedisKeyEnum keyEnum, Object... params) { + return redisTemplate.opsForHash().entries(getRealKey(keyEnum, params)); + } + + public boolean hmset(SpdmRedisKeyEnum keyEnum, Map map, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + redisTemplate.opsForHash().putAll(realKey, map); + expire(keyEnum, params); + return true; + } catch (Exception e) { + log.error("redis hash批量存入异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + public boolean hset(SpdmRedisKeyEnum keyEnum, String item, Object value, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + redisTemplate.opsForHash().put(realKey, item, value); + expire(keyEnum, params); + return true; + } catch (Exception e) { + log.error("redis hash存入异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + public void hdel(SpdmRedisKeyEnum keyEnum, Object... items) { + hdel(keyEnum, null, items); + } + + public void hdel(SpdmRedisKeyEnum keyEnum, Object[] params, Object... items) { + redisTemplate.opsForHash().delete(getRealKey(keyEnum, params), items); + } + + public boolean hHasKey(SpdmRedisKeyEnum keyEnum, String item, Object... params) { + return redisTemplate.opsForHash().hasKey(getRealKey(keyEnum, params), item); + } + + public double hincr(SpdmRedisKeyEnum keyEnum, String item, double by, Object... params) { + return redisTemplate.opsForHash().increment(getRealKey(keyEnum, params), item, by); + } + + public double hdecr(SpdmRedisKeyEnum keyEnum, String item, double by, Object... params) { + return redisTemplate.opsForHash().increment(getRealKey(keyEnum, params), item, -by); + } + + // ==================== 4. Set 类型 ==================== + + public Set sGet(SpdmRedisKeyEnum keyEnum, Object... params) { + return redisTemplate.opsForSet().members(getRealKey(keyEnum, params)); + } + + public boolean sHasKey(SpdmRedisKeyEnum keyEnum, Object value, Object... params) { + return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(getRealKey(keyEnum, params), value)); + } + + public long sSet(SpdmRedisKeyEnum keyEnum, Object... values) { + return sSet(keyEnum, new Object[0], values); + } + + public long sSet(SpdmRedisKeyEnum keyEnum, Object[] params, Object... values) { + try { + String realKey = getRealKey(keyEnum, params); + Long count = redisTemplate.opsForSet().add(realKey, values); + expire(keyEnum, params); + return count == null ? 0 : count; + } catch (Exception e) { + log.error("redis set存入异常!key:{}", getRealKey(keyEnum, params), e); + return 0; + } + } + + public long sGetSetSize(SpdmRedisKeyEnum keyEnum, Object... params) { + Long size = redisTemplate.opsForSet().size(getRealKey(keyEnum, params)); + return size == null ? 0 : size; + } + + public long setRemove(SpdmRedisKeyEnum keyEnum, Object... values) { + return setRemove(keyEnum, new Object[0], values); + } + + public long setRemove(SpdmRedisKeyEnum keyEnum, Object[] params, Object... values) { + Long count = redisTemplate.opsForSet().remove(getRealKey(keyEnum, params), values); + return count == null ? 0 : count; + } + + // ==================== 5. ZSet 类型 ==================== + + // ==================== 5. ZSet 类型(修正版)==================== + + /** + * ZSet 添加元素(带分数) + */ + public Boolean zAdd(SpdmRedisKeyEnum keyEnum, Object value, double score, Object... params) { + try { + String realKey = getRealKey(keyEnum, params); + return redisTemplate.opsForZSet().add(realKey, value, score); + } catch (Exception e) { + log.error("redis zset添加异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + /** + * ZSet 移除指定元素(修复完成) + */ + public long zRemove(SpdmRedisKeyEnum keyEnum, Object... values) { + return zRemove(keyEnum, new Object[0], values); + } + + public long zRemove(SpdmRedisKeyEnum keyEnum, Object[] params, Object... values) { + try { + String realKey = getRealKey(keyEnum, params); + Long count = redisTemplate.opsForZSet().remove(realKey, values); + return count == null ? 0 : count; + } catch (Exception e) { + log.error("redis zset移除异常!key:{}", getRealKey(keyEnum, params), e); + return 0; + } + } + + /** + * 获取ZSet元素数量 + */ + public long zSize(SpdmRedisKeyEnum keyEnum, Object... params) { + Long size = redisTemplate.opsForZSet().size(getRealKey(keyEnum, params)); + return size == null ? 0 : size; + } + + // ==================== 6. List 类型 ==================== + + public List lGet(SpdmRedisKeyEnum keyEnum, long start, long end, Object... params) { + return redisTemplate.opsForList().range(getRealKey(keyEnum, params), start, end); + } + + public List lGetAll(SpdmRedisKeyEnum keyEnum, Object... params) { + return lGet(keyEnum, 0, -1, params); + } + + public long lGetListSize(SpdmRedisKeyEnum keyEnum, Object... params) { + Long size = redisTemplate.opsForList().size(getRealKey(keyEnum, params)); + return size == null ? 0 : size; + } + + public Object lGetIndex(SpdmRedisKeyEnum keyEnum, long index, Object... params) { + return redisTemplate.opsForList().index(getRealKey(keyEnum, params), index); + } + + public boolean lSet(SpdmRedisKeyEnum keyEnum, Object value, Object... params) { + try { + redisTemplate.opsForList().rightPush(getRealKey(keyEnum, params), value); + expire(keyEnum, params); + return true; + } catch (Exception e) { + log.error("redis list存入异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + public boolean lSet(SpdmRedisKeyEnum keyEnum, List value, Object... params) { + try { + redisTemplate.opsForList().rightPushAll(getRealKey(keyEnum, params), value); + expire(keyEnum, params); + return true; + } catch (Exception e) { + log.error("redis list批量存入异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + public Object lLeftPop(SpdmRedisKeyEnum keyEnum, Object... params) { + return redisTemplate.opsForList().leftPop(getRealKey(keyEnum, params)); + } + + public boolean lUpdateIndex(SpdmRedisKeyEnum keyEnum, long index, Object value, Object... params) { + try { + redisTemplate.opsForList().set(getRealKey(keyEnum, params), index, value); + return true; + } catch (Exception e) { + log.error("redis list更新异常!key:{}", getRealKey(keyEnum, params), e); + return false; + } + } + + public long lRemove(SpdmRedisKeyEnum keyEnum, long count, Object value, Object... params) { + Long remove = redisTemplate.opsForList().remove(getRealKey(keyEnum, params), count, value); + return remove == null ? 0 : remove; + } + + public void lRemoveAll(SpdmRedisKeyEnum keyEnum, Object... params) { + redisTemplate.opsForList().trim(getRealKey(keyEnum, params), -1, 0); + } + + +} + + + diff --git a/data/src/main/java/com/sdm/data/config/RedisConfig.java b/data/src/main/java/com/sdm/data/config/RedisConfig.java index 4399fbc7..19d2ed5d 100644 --- a/data/src/main/java/com/sdm/data/config/RedisConfig.java +++ b/data/src/main/java/com/sdm/data/config/RedisConfig.java @@ -1,45 +1,45 @@ -package com.sdm.data.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - +//package com.sdm.data.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +//@Configuration +//public class RedisConfig { +// +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } +// +// @Bean(name = "bytesRedisTemplate") +// public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// redisTemplate.setConnectionFactory(connectionFactory); +// // 设置key和value的序列化规则 +// redisTemplate.setValueSerializer(RedisSerializer.byteArray()); +// redisTemplate.setKeySerializer(new StringRedisSerializer()); +// redisTemplate.afterPropertiesSet(); +// +// return redisTemplate; +// } +//} +// +// +// diff --git a/pbs/src/main/java/com/sdm/pbs/config/RedisConfig.java b/pbs/src/main/java/com/sdm/pbs/config/RedisConfig.java deleted file mode 100644 index eb9e4f85..00000000 --- a/pbs/src/main/java/com/sdm/pbs/config/RedisConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.sdm.pbs.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - diff --git a/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java b/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java index 38f64a42..246eb70f 100644 --- a/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java +++ b/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java @@ -16,7 +16,9 @@ import com.sdm.pbs.model.bo.HpcJobStatusInfo; import com.sdm.pbs.model.bo.HpcResouceInfo; import com.sdm.pbs.model.entity.SimulationHpcCommand; import com.sdm.pbs.model.entity.SimulationJob; -import com.sdm.pbs.model.req.*; +import com.sdm.pbs.model.req.JobFileCallBackReq; +import com.sdm.pbs.model.req.QueryJobReq; +import com.sdm.pbs.model.req.SubmitHpcTaskReq; import com.sdm.pbs.service.HpcInstructionService; import com.sdm.pbs.service.IPbsService; import com.sdm.pbs.service.impl.PbsServiceDecorator; @@ -101,7 +103,7 @@ public class TaskController { @PostMapping("/hpcDownloadFile") @Operation(summary = "作业下文件下载") ResponseEntity hpcDownloadFile(@RequestBody HpcTaskFileDownReq req) { - return pbsService.downloadFile(req.getJobId(),req.getFileName(),req.getFileSize()); + return pbsService.downloadFile(req.getJobId(),req.getFileName()); } @PostMapping("/queryJobs") @@ -280,4 +282,13 @@ public class TaskController { Long.valueOf(paramMap.get("userId").toString()),Long.valueOf(paramMap.get("tenantId").toString()),paramMap.get("outputFormat").toString()); } + @GetMapping("/mockHpcDownloadFile") + @Operation(summary = "模拟作业下文件下载") + ResponseEntity mockHpcDownloadFile() { + HpcTaskFileDownReq req = new HpcTaskFileDownReq(); + req.setFileName("\\\\HPC-COMPUTE-01\\share\\testbigfile\\test.zip"); +// req.setFileName("D:\\0000-测试\\test.txt"); + return pbsService.downloadFile(req.getJobId(),req.getFileName()); + } + } diff --git a/pbs/src/main/java/com/sdm/pbs/controller/TestRedisController.java b/pbs/src/main/java/com/sdm/pbs/controller/TestRedisController.java new file mode 100644 index 00000000..91582789 --- /dev/null +++ b/pbs/src/main/java/com/sdm/pbs/controller/TestRedisController.java @@ -0,0 +1,69 @@ +package com.sdm.pbs.controller; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.common.SpdmRedisKeyEnum; +import com.sdm.common.utils.SpdmRedisUtil; +import com.sdm.pbs.model.entity.SimulationJob; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping +@Tag(name = "测试redis", description = "测试redis") +public class TestRedisController { + @Autowired + private SpdmRedisUtil spdmRedisUtil; + + /** + * 测试设置缓存(POST请求,Map接收参数) + * 请求体示例:{"key":"testKey", "value":"testValue", "timeout":1, "timeUnit":"HOURS"} + */ + @PostMapping("/redis/set") + public SdmResponse setRedis(@RequestBody Map paramMap) { + // 1. 从Map中获取参数,做非空校验 + String id1 = (String) paramMap.get("id1"); + String id2 = (String) paramMap.get("id2"); + SimulationJob job = new SimulationJob(); + job.setDelFlag("1"); + job.setInputFormat("11111"); + job.setOutputFormat("22222"); + job.setJobId("4444"); + // 3. 设置缓存 + Pair pair1 = spdmRedisUtil.set(SpdmRedisKeyEnum.YANG_TEST1, job, id1); + Pair pair2 = spdmRedisUtil.set(SpdmRedisKeyEnum.YANG_TEST2, "value222", id2); + Map map = new HashMap<>(); + map.put(pair1.getRight(), pair1.getLeft()); + map.put(pair2.getRight(), pair2.getLeft()); + return SdmResponse.success(map); + } + + /** + * 测试获取缓存(POST请求,Map接收参数) + * 请求体示例:{"key":"testKey"} + */ + @PostMapping("/redis/get") + public SdmResponse getRedis(@RequestBody Map paramMap) { + String id1 = (String) paramMap.get("id1"); + String id2 = (String) paramMap.get("id2"); + // 获取缓存 + SimulationJob job = spdmRedisUtil.getBean(SpdmRedisKeyEnum.YANG_TEST1, SimulationJob.class, id1); + String value2 = (String) spdmRedisUtil.get(SpdmRedisKeyEnum.YANG_TEST2,id2); + Map map = new HashMap<>(); + map.put("value1", job); + map.put("value2", value2); + return SdmResponse.success(map); + } + +} + + diff --git a/pbs/src/main/java/com/sdm/pbs/service/HpcInstructionService.java b/pbs/src/main/java/com/sdm/pbs/service/HpcInstructionService.java index 9d70fccc..4b699ee9 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/HpcInstructionService.java +++ b/pbs/src/main/java/com/sdm/pbs/service/HpcInstructionService.java @@ -53,7 +53,7 @@ public interface HpcInstructionService { SdmResponse> scanDir(String targetDir); - ResponseEntity hpcDownloadFile(String fileName,Long fileSize); + ResponseEntity hpcDownloadFile(String fileName); // 通知hpc回传文件 SdmResponse callHpcUploadToTarget(String jobId,String workDir,String minioBucket, diff --git a/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java b/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java index f289eb38..00942948 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java +++ b/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java @@ -54,7 +54,7 @@ public interface IPbsService { * @param fileName * @return */ - ResponseEntity downloadFile(String jobId, String fileName,Long fileSize); + ResponseEntity downloadFile(String jobId, String fileName); void streamTaskLog(String filePath,String clientToken, OutputStream outputStream); diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/HpcInstructionServiceImpl.java b/pbs/src/main/java/com/sdm/pbs/service/impl/HpcInstructionServiceImpl.java index 94ca736a..e6230f04 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/HpcInstructionServiceImpl.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/HpcInstructionServiceImpl.java @@ -57,10 +57,6 @@ public class HpcInstructionServiceImpl implements HpcInstructionService { @Autowired private HpcCommandExcuteUtil hpcCommandExcuteUtil; - @Autowired - @Qualifier("pbsWebClient") - private WebClient pbsWebClient; - @Value("#{'${hpc.newJob.stringFields:jobname,license,projectname}'.split(',')}") private List newJobStringFields; @Value("#{'${hpc.addJob.stringFields:name,license,projectname}'.split(',')}") @@ -494,8 +490,8 @@ public class HpcInstructionServiceImpl implements HpcInstructionService { } @Override - public ResponseEntity hpcDownloadFile(String fileName,Long fileSize) { - return hpcCommandExcuteUtil.hpcDownloadFile(fileName,fileSize,pbsWebClient); + public ResponseEntity hpcDownloadFile(String fileName) { + return hpcCommandExcuteUtil.hpcDownloadFile(fileName); } @Override diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java b/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java index 05169483..7d3a1bb8 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java @@ -131,8 +131,8 @@ public class IPbsHpcServiceImpl implements IPbsService { } @Override - public ResponseEntity downloadFile(String jobId, String fileName,Long fileSize) { - return hpcInstructionService.hpcDownloadFile(fileName,fileSize); + public ResponseEntity downloadFile(String jobId, String fileName) { + return hpcInstructionService.hpcDownloadFile(fileName); } @Override diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java index 7d85082d..cbe308ae 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java @@ -590,12 +590,12 @@ public class PbsServiceDecorator implements IPbsServiceDecorator { } @Override - public ResponseEntity downloadFile(String jobId, String fileName,Long fileSize) { + public ResponseEntity downloadFile(String jobId, String fileName) { // todo 预留根据jobId 获取工作目录,做权限控制,越权 if(StringUtils.isBlank(fileName)){ throw new RuntimeException("下载文件路径为空"); } - return pbsService.downloadFile("", fileName,fileSize); + return pbsService.downloadFile("", fileName); } @Override diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceImpl.java b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceImpl.java index e9f3ddb9..83702130 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceImpl.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceImpl.java @@ -7,9 +7,9 @@ import com.paratera.lpcs.core.invoker.ApiClient; import com.paratera.lpcs.core.invoker.ApiException; import com.paratera.lpcs.core.invoker.ApiResponse; import com.paratera.lpcs.core.model.*; -import com.sdm.common.entity.constants.RedisConstant; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; +import com.sdm.common.entity.constants.RedisConstant; import com.sdm.common.entity.pojo.pbs.*; import com.sdm.common.entity.pojo.project.ProjectNodeBase; import com.sdm.common.entity.pojo.task.TaskBase; diff --git a/pbs/src/main/resources/application-dev-100.yml b/pbs/src/main/resources/application-dev-100.yml index e0dc3ada..792f36c9 100644 --- a/pbs/src/main/resources/application-dev-100.yml +++ b/pbs/src/main/resources/application-dev-100.yml @@ -1,9 +1,22 @@ server: port: 7105 + tomcat: + # 等待客户端发送数据的超时(毫秒) + connection-timeout: 60000 + # Keep-Alive 长连接保持时间(毫秒) + keep-alive-timeout: 30000 + # 异步超时(根据业务需要) + async-timeout: -1 spring: application: name: pbs + # 关闭 Spring 的 “内存缓冲” + codec: + max-in-memory-size: -1 + mvc: + async: + request-timeout: -1 # 🔥 关闭 Spring 异步超时(关键!) datasource: username: root password: mysql @@ -34,7 +47,7 @@ spring: cloud: nacos: discovery: - server-addr: 192.168.190.190:5848 + server-addr: 192.168.190.100:5848 group: DEV_GROUP enabled: true # namespace: 3 @@ -42,30 +55,27 @@ spring: # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: - # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 + # 哨兵配置 + sentinel: + # 建议:确保这里填写的 IP 是容器外部可访问的宿主机 IP 或 Docker 网络 IP + nodes: 192.168.190.163:26379,192.168.190.163:26380,192.168.190.163:26381 + master: mymaster + password: spdm@2026 database: 0 - # redis服务器地址(填写自己的服务器地址) - host: 192.168.190.100 - # redis端口(默认6379) - port: 5379 - #redis连接超时等待,10秒 - timeout: PT10S - # redis访问密码(默认为空) - password: lettuce: pool: - # 连接池最大连接数(使用负值表示没有限制) 默认 8 - max-active: 50 - # 连接池中的最大空闲连接 默认 8 - max-idle: 20 - # 连接池中的最小空闲连接 默认 0 - min-idle: 1 - # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1,这里配置10s - max-wait: PT10S -# password: -# sentinel: -# master: mymaster -# nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 + # 根据并发量调整,一般 Web 服务建议 50-100 + max-active: 16 + max-idle: 16 # 保持与 max-active 一致,充分利用连接池 + min-idle: 4 # 适当调大最小空闲,避免冷启动时频繁创建连接 + max-wait: 1000 # 获取连接最大等待时间 (ms),保持 1s + # 优雅关闭时间,避免应用停止时强制切断连接 + shutdown-timeout: 2000 + # 超时配置 + connect-timeout: 5000 + # 命令执行超时时间 (默认为无限,生产环境建议设置以防死锁) + timeout: 5000 + servlet: multipart: # 单个文件的最大值 @@ -112,27 +122,28 @@ file: hpc: url: http://172.27.3.135/JSONAPI/JSONAPI.ashx # 这个是spdm mock执行cmd命令 -# remoteCmdUrl: http://127.0.0.1:9097/doProcess + # remoteCmdUrl: http://127.0.0.1:9097/doProcess # remote: hpc借助工具http远程调用,local:该服务和hpc部署在同一机器 excuteWay: remote - remoteCmdUrl: http://192.168.65.55:9097/doProcess - remoteCreateDirUrl: http://192.168.65.55:9097/createDir - remoteScanDirUrl: http://192.168.65.55:9097/scanDir - remoteDownLoadFileUrl: http://192.168.65.55:9097/hpcDownload -# remoteDownLoadFileUrl: http://127.0.0.1:9097/hpcDownload - remoteUploadFileUrl: http://192.168.65.55:9097/uploadHpcFile - callHpcUpload: http://192.168.65.55:9097/addJobQueue - delHpcJobsUrl: http://192.168.65.55:9098/delHpcJobs + remoteCmdUrl: http://192.168.190.164:8097/doProcess + remoteCreateDirUrl: http://192.168.190.164:8098/createDir + remoteScanDirUrl: http://192.168.190.164:8098/scanDir + remoteDownLoadFileUrl: http://192.168.190.164:8098/hpcDownload + remoteUploadFileUrl: http://192.168.190.164:8098/uploadHpcFile + callHpcUpload: http://192.168.190.164:8098/addJobQueue + delHpcJobsUrl: http://192.168.190.164:8098/delHpcJobs + # 动态日志读取 + streamlogUrl: http://192.168.190.164:8098/streamLog/%s?filePath=%s + stopStreamlogUrl: http://192.168.190.164:8098/stopLog/%s # 上传头节点文件相关的配置 fileToHpc: http: scheme: http # 协议(http/https) host: 192.168.190.164 # 目标主机 - port: 9098 # 目标端口 + port: 8098 # 目标端口 path: /upFileToHpcBatch # 接口路径 mergePath: /upFileToHpcMerge # 合并的接口路径 - #logging: # config: ./config/logback.xml # pbs 作业提交相关配置 @@ -148,6 +159,7 @@ security: - /pbs/jobFileCallback - /pbs/netTest - /pbs/adapterSubmitHpcJob + - /pbs/mockHpcDownloadFile # xxljob 配置开始 xxl: diff --git a/pbs/src/main/resources/application-dev-190.yml b/pbs/src/main/resources/application-dev-190.yml index 39abeb61..1f3c0c3a 100644 --- a/pbs/src/main/resources/application-dev-190.yml +++ b/pbs/src/main/resources/application-dev-190.yml @@ -1,5 +1,13 @@ server: port: 7105 + tomcat: + # 等待客户端发送数据的超时(毫秒) + connection-timeout: 60000 + # Keep-Alive 长连接保持时间(毫秒) + keep-alive-timeout: 30000 + # 异步超时(根据业务需要) + async-timeout: -1 + spring: application: @@ -40,32 +48,30 @@ spring: # namespace: 3 # username: nacos # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + data: redis: - # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 + # 哨兵配置 + sentinel: + # 建议:确保这里填写的 IP 是容器外部可访问的宿主机 IP 或 Docker 网络 IP + nodes: 192.168.190.164:26379,192.168.190.164:26380,192.168.190.164:26381 + master: mymaster + password: spdm@2026 database: 0 - # redis服务器地址(填写自己的服务器地址) - host: 192.168.2.166 - # redis端口(默认6379) - port: 6379 - #redis连接超时等待,10秒 - timeout: PT10S - # redis访问密码(默认为空) - password: lettuce: pool: - # 连接池最大连接数(使用负值表示没有限制) 默认 8 - max-active: 50 - # 连接池中的最大空闲连接 默认 8 - max-idle: 20 - # 连接池中的最小空闲连接 默认 0 - min-idle: 1 - # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1,这里配置10s - max-wait: PT10S -# password: -# sentinel: -# master: mymaster -# nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 + # 根据并发量调整,一般 Web 服务建议 50-100 + max-active: 16 + max-idle: 16 # 保持与 max-active 一致,充分利用连接池 + min-idle: 4 # 适当调大最小空闲,避免冷启动时频繁创建连接 + max-wait: 1000 # 获取连接最大等待时间 (ms),保持 1s + # 优雅关闭时间,避免应用停止时强制切断连接 + shutdown-timeout: 2000 + # 超时配置 + connect-timeout: 5000 + # 命令执行超时时间 (默认为无限,生产环境建议设置以防死锁) + timeout: 5000 + servlet: multipart: # 单个文件的最大值 @@ -148,6 +154,8 @@ security: - /pbs/netTest - /pbs/adapterSubmitHpcJob - /pbs/testEn + - /redis/set + - /redis/get testEnStr: ENC(095i92PAFyJQ5kEnkiaCYReMEtw+Dwc8qnS1i7Vx0Y8=) testEnStr1: ENC(AtQcdulLNvaSvboZuWsXIxuCwrHyUoG3oEGtmKfDSbs=) diff --git a/pbs/src/main/resources/application-dev-65.yml b/pbs/src/main/resources/application-dev-65.yml index 7556b209..4cd04e3e 100644 --- a/pbs/src/main/resources/application-dev-65.yml +++ b/pbs/src/main/resources/application-dev-65.yml @@ -1,9 +1,22 @@ server: port: 7105 + tomcat: + # 等待客户端发送数据的超时(毫秒) + connection-timeout: 60000 + # Keep-Alive 长连接保持时间(毫秒) + keep-alive-timeout: 30000 + # 异步超时(根据业务需要) + async-timeout: -1 spring: application: name: pbs +# 关闭 Spring 的 “内存缓冲” + codec: + max-in-memory-size: -1 + mvc: + async: + request-timeout: -1 # 🔥 关闭 Spring 异步超时(关键!) datasource: username: root password: mysql @@ -37,41 +50,37 @@ spring: server-addr: 192.168.65.161:8848 group: DEV_GROUP enabled: true -# namespace: 3 -# username: nacos -# password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + # namespace: 3 + # username: nacos + # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: - # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 + # 哨兵配置 + sentinel: + # 建议:确保这里填写的 IP 是容器外部可访问的宿主机 IP 或 Docker 网络 IP + nodes: 192.168.190.163:26379,192.168.190.163:26380,192.168.190.163:26381 + master: mymaster + password: spdm@2026 database: 0 - # redis服务器地址(填写自己的服务器地址) - host: 192.168.2.166 - # redis端口(默认6379) - port: 6379 - #redis连接超时等待,10秒 - timeout: PT10S - # redis访问密码(默认为空) - password: lettuce: pool: - # 连接池最大连接数(使用负值表示没有限制) 默认 8 - max-active: 50 - # 连接池中的最大空闲连接 默认 8 - max-idle: 20 - # 连接池中的最小空闲连接 默认 0 - min-idle: 1 - # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1,这里配置10s - max-wait: PT10S -# password: -# sentinel: -# master: mymaster -# nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 + # 根据并发量调整,一般 Web 服务建议 50-100 + max-active: 16 + max-idle: 16 # 保持与 max-active 一致,充分利用连接池 + min-idle: 4 # 适当调大最小空闲,避免冷启动时频繁创建连接 + max-wait: 1000 # 获取连接最大等待时间 (ms),保持 1s + # 优雅关闭时间,避免应用停止时强制切断连接 + shutdown-timeout: 2000 + # 超时配置 + connect-timeout: 5000 + # 命令执行超时时间 (默认为无限,生产环境建议设置以防死锁) + timeout: 5000 + servlet: - multipart: - # 单个文件的最大值 - max-file-size: 500MB - # 上传文件总的最大值 - max-request-size: 10240MB + servlet: + multipart: + max-file-size: -1 + max-request-size: -1 management: endpoints: @@ -86,7 +95,7 @@ mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# cache-enabled: true + # cache-enabled: true # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml global-config: @@ -115,25 +124,26 @@ hpc: # remoteCmdUrl: http://127.0.0.1:9097/doProcess # remote: hpc借助工具http远程调用,local:该服务和hpc部署在同一机器 excuteWay: remote - remoteCmdUrl: http://192.168.190.164:8097/doProcess - remoteCreateDirUrl: http://192.168.190.164:8098/createDir - remoteScanDirUrl: http://192.168.190.164:8098/scanDir - remoteDownLoadFileUrl: http://192.168.190.164:8098/hpcDownload - remoteUploadFileUrl: http://192.168.190.164:8098/uploadHpcFile - callHpcUpload: http://192.168.190.164:8098/addJobQueue - delHpcJobsUrl: http://192.168.190.164:8098/delHpcJobs + remoteCmdUrl: http://127.0.0.1:9097/doProcess + remoteCreateDirUrl: http://127.0.0.1:9098/createDir + remoteScanDirUrl: http://127.0.0.1:9098/scanDir + remoteDownLoadFileUrl: http://127.0.0.1:9098/hpcDownload + remoteUploadFileUrl: http://127.0.0.1:9098/uploadHpcFile + callHpcUpload: http://127.0.0.1:9098/addJobQueue + delHpcJobsUrl: http://127.0.0.1:9098/delHpcJobs # 动态日志读取 - streamlogUrl: http://192.168.190.164:8098/streamLog/%s?filePath=%s - stopStreamlogUrl: http://192.168.190.164:8098/stopLog/%s + streamlogUrl: http://127.0.0.1:9098/streamLog/%s?filePath=%s + stopStreamlogUrl: http://127.0.0.1:9098/stopLog/%s # 上传头节点文件相关的配置 fileToHpc: http: scheme: http # 协议(http/https) - host: 192.168.190.164 # 目标主机 - port: 8098 # 目标端口 + host: 127.0.0.1 # 目标主机 + port: 9098 # 目标端口 path: /upFileToHpcBatch # 接口路径 mergePath: /upFileToHpcMerge # 合并的接口路径 + #logging: # config: ./config/logback.xml # pbs 作业提交相关配置 @@ -149,6 +159,7 @@ security: - /pbs/jobFileCallback - /pbs/netTest - /pbs/adapterSubmitHpcJob + - /pbs/mockHpcDownloadFile # xxljob 配置开始 xxl: diff --git a/pbs/src/main/resources/application-lyric.yml b/pbs/src/main/resources/application-lyric.yml index 0776a43e..fa9056ba 100644 --- a/pbs/src/main/resources/application-lyric.yml +++ b/pbs/src/main/resources/application-lyric.yml @@ -1,9 +1,22 @@ server: port: 7105 + tomcat: + # 等待客户端发送数据的超时(毫秒) + connection-timeout: 60000 + # Keep-Alive 长连接保持时间(毫秒) + keep-alive-timeout: 30000 + # 异步超时(根据业务需要) + async-timeout: -1 spring: application: name: pbs + # 关闭 Spring 的 “内存缓冲” + codec: + max-in-memory-size: -1 + mvc: + async: + request-timeout: -1 # 关闭 Spring 异步超时(关键!) datasource: username: root password: ENC(o5nKvbyfceJryxfBBGTi9w==) @@ -45,7 +58,7 @@ spring: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 database: 0 # redis服务器地址(填写自己的服务器地址) - host: 192.168.30.145 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 @@ -55,17 +68,14 @@ spring: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 - max-active: 50 + max-active: 16 # 连接池中的最大空闲连接 默认 8 - max-idle: 20 + max-idle: 16 # 连接池中的最小空闲连接 默认 0 - min-idle: 1 + min-idle: 4 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1,这里配置10s max-wait: PT10S -# password: -# sentinel: -# master: mymaster -# nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 + servlet: multipart: # 单个文件的最大值 @@ -123,6 +133,9 @@ hpc: remoteUploadFileUrl: http://10.122.38.200:9098/uploadHpcFile callHpcUpload: http://10.122.38.200:9098/addJobQueue delHpcJobsUrl: http://10.122.38.200:9098/delHpcJobs + # 动态日志读取 + streamlogUrl: http://10.122.38.200:9098/streamLog/%s?filePath=%s + stopStreamlogUrl: http://10.122.38.200:9098/stopLog/%s # 上传头节点文件相关的配置 fileToHpc: http: @@ -161,6 +174,7 @@ security: - /getProjectInfo - /mockSecondSql - /mockThirdSql + - /pbs/mockHpcDownloadFile # xxljob 配置开始 xxl: diff --git a/project/src/main/java/com/sdm/project/config/RedisConfig.java b/project/src/main/java/com/sdm/project/config/RedisConfig.java index 1f7fc24d..8f046dad 100644 --- a/project/src/main/java/com/sdm/project/config/RedisConfig.java +++ b/project/src/main/java/com/sdm/project/config/RedisConfig.java @@ -1,45 +1,45 @@ -package com.sdm.project.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - +//package com.sdm.project.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +//@Configuration +//public class RedisConfig { +// +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } +// +// @Bean(name = "bytesRedisTemplate") +// public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// redisTemplate.setConnectionFactory(connectionFactory); +// // 设置key和value的序列化规则 +// redisTemplate.setValueSerializer(RedisSerializer.byteArray()); +// redisTemplate.setKeySerializer(new StringRedisSerializer()); +// redisTemplate.afterPropertiesSet(); +// +// return redisTemplate; +// } +//} +// +// +// diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java index a1ebe35b..80fccd32 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java @@ -168,4 +168,9 @@ public class SpdmTaskListReq { */ private String submitterName; + /** + * 利元亨定制,支持查询主题名(需求名) + */ + private String tag10; + } diff --git a/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java index 3ca76912..012bbf4c 100644 --- a/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java @@ -883,11 +883,12 @@ public class LyricInternalServiceImpl implements ILyricInternalService { Map> permissionMap = updatePermissionList.stream().collect(Collectors.groupingBy(UpdatePermissionReq::getUuid)); for (Map.Entry> permissionEntry : permissionMap.entrySet()) { BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); - Map userPermissions = new HashMap<>(); String uuid = permissionEntry.getKey(); + Map userPermissions = new HashMap<>(); item.setUuid(uuid); - for (UpdatePermissionReq updatePermissionReq : permissionEntry.getValue()) { - userPermissions.put(updatePermissionReq.getUserId(), updatePermissionReq.getPermission()); + List updatePermissionReqList = permissionEntry.getValue(); + for (UpdatePermissionReq updatePermissionReq : updatePermissionReqList) { + userPermissions.putAll(updatePermissionReq.getUserPermissions()); } item.setUserPermissions(userPermissions); filePermissions.add(item); diff --git a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java index 949d04bc..fbc492f6 100644 --- a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java @@ -4072,11 +4072,12 @@ public class NodeServiceImpl extends ServiceImpl> permissionMap = permissionReqList.stream().collect(Collectors.groupingBy(UpdatePermissionReq::getUuid)); for (Map.Entry> permissionEntry : permissionMap.entrySet()) { BatchUpdatePermissionReq.FilePermissionItem item = new BatchUpdatePermissionReq.FilePermissionItem(); - Map userPermissions = new HashMap<>(); String uuid = permissionEntry.getKey(); + Map userPermissions = new HashMap<>(); item.setUuid(uuid); - for (UpdatePermissionReq updatePermissionReq : permissionEntry.getValue()) { - userPermissions.put(updatePermissionReq.getUserId(), updatePermissionReq.getPermission()); + List updatePermissionReqList = permissionEntry.getValue(); + for (UpdatePermissionReq updatePermissionReq : updatePermissionReqList) { + userPermissions.putAll(updatePermissionReq.getUserPermissions()); } item.setUserPermissions(userPermissions); filePermissions.add(item); diff --git a/project/src/main/resources/mapper/SimulationTaskMapper.xml b/project/src/main/resources/mapper/SimulationTaskMapper.xml index 42925aef..573545bd 100644 --- a/project/src/main/resources/mapper/SimulationTaskMapper.xml +++ b/project/src/main/resources/mapper/SimulationTaskMapper.xml @@ -780,6 +780,9 @@ and expStatus = #{req.expStatusValue} + + and tag10 = #{req.tag10} + and ( diff --git a/system/src/main/java/com/sdm/system/config/RedisConfig.java b/system/src/main/java/com/sdm/system/config/RedisConfig.java index 5843d681..b5e6ffed 100644 --- a/system/src/main/java/com/sdm/system/config/RedisConfig.java +++ b/system/src/main/java/com/sdm/system/config/RedisConfig.java @@ -1,45 +1,45 @@ -package com.sdm.system.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - +//package com.sdm.system.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +//@Configuration +//public class RedisConfig { +// +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } +// +// @Bean(name = "bytesRedisTemplate") +// public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// redisTemplate.setConnectionFactory(connectionFactory); +// // 设置key和value的序列化规则 +// redisTemplate.setValueSerializer(RedisSerializer.byteArray()); +// redisTemplate.setKeySerializer(new StringRedisSerializer()); +// redisTemplate.afterPropertiesSet(); +// +// return redisTemplate; +// } +//} +// +// +// diff --git a/task/src/main/java/com/sdm/task/config/RedisConfig.java b/task/src/main/java/com/sdm/task/config/RedisConfig.java index 00e252c8..0374046c 100644 --- a/task/src/main/java/com/sdm/task/config/RedisConfig.java +++ b/task/src/main/java/com/sdm/task/config/RedisConfig.java @@ -1,45 +1,45 @@ -package com.sdm.task.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -public class RedisConfig { - - @Bean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory factory) { - RedisTemplate template = new RedisTemplate<>(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - - template.setConnectionFactory(factory); - // key序列化方式 - template.setKeySerializer(redisSerializer); - // value序列化 - template.setValueSerializer(redisSerializer); - // value hashmap序列化 - template.setHashValueSerializer(redisSerializer); - // key haspmap序列化 - template.setHashKeySerializer(redisSerializer); - - return template; - } - - @Bean(name = "bytesRedisTemplate") - public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(connectionFactory); - // 设置key和value的序列化规则 - redisTemplate.setValueSerializer(RedisSerializer.byteArray()); - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.afterPropertiesSet(); - - return redisTemplate; - } -} - - - +//package com.sdm.task.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +//@Configuration +//public class RedisConfig { +// +// @Bean(name = "redisTemplate") +// public RedisTemplate redisTemplate(RedisConnectionFactory factory) { +// RedisTemplate template = new RedisTemplate<>(); +// RedisSerializer redisSerializer = new StringRedisSerializer(); +// +// template.setConnectionFactory(factory); +// // key序列化方式 +// template.setKeySerializer(redisSerializer); +// // value序列化 +// template.setValueSerializer(redisSerializer); +// // value hashmap序列化 +// template.setHashValueSerializer(redisSerializer); +// // key haspmap序列化 +// template.setHashKeySerializer(redisSerializer); +// +// return template; +// } +// +// @Bean(name = "bytesRedisTemplate") +// public RedisTemplate bytesRedisTemplate(RedisConnectionFactory connectionFactory) { +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// redisTemplate.setConnectionFactory(connectionFactory); +// // 设置key和value的序列化规则 +// redisTemplate.setValueSerializer(RedisSerializer.byteArray()); +// redisTemplate.setKeySerializer(new StringRedisSerializer()); +// redisTemplate.afterPropertiesSet(); +// +// return redisTemplate; +// } +//} +// +// +//