diff --git a/capability/src/main/resources/application-prod.yml b/capability/src/main/resources/application-prod.yml index 198c43f7..c4f4eef4 100644 --- a/capability/src/main/resources/application-prod.yml +++ b/capability/src/main/resources/application-prod.yml @@ -5,51 +5,48 @@ spring: application: name: capability datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306 /spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + maximum-pool-size: 450 # 连接池最大连接数(关键!) + minimum-idle: 50 # 最小空闲连接数(与最大一致,避免频繁创建销毁) + idle-timeout: 300000 # 空闲连接超时时间(5分钟) + max-lifetime: 600000 # 连接最大存活时间(10分钟) + connection-timeout: 30000 # 获取连接超时时间(30秒,避免线程阻塞) master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306 /spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver - hikari: - # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 - maximum-pool-size: 20 - # 连接池在空闲时保持的最小连接数。 - minimum-idle: 5 - # 一个连接在被标记为空闲之前可以保持空闲状态的最长时间(毫秒)。当连接的空闲时间超过此值后,它可能会被连接池 evict(驱逐)。 - idle-timeout: 60000 # 1 min - # 一个连接从被创建开始,其生命周期的最大时长(毫秒)。HikariCP的默认值就是30分钟,这是一个非常合理的设置。 - max-lifetime: 1800000 # 30 min(Hikari 默认) - # 应用程序尝试从连接池获取一个连接时,等待的最长时间(毫秒)。建议值:30-60秒。 - connection-timeout: 30000 # 30s slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306 /spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 -# server-addr: 127.0.0.1:8848 + server-addr: 192.168.30.146:8848 + group: PROD_GROUP + # server-addr: 127.0.0.1:8848 enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 + # username: nacos + # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 + database: 0 # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 timeout: PT10S # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + password: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 @@ -60,10 +57,10 @@ spring: 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 + # password: + # sentinel: + # master: mymaster + # nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 servlet: multipart: # 单个文件的最大值 @@ -71,11 +68,21 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # cache-enabled: true + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -95,40 +102,13 @@ lombok: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm -hpc: - url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 +security: + whitelist: + paths: + - /pbs/jobFileCallback + - /flow/approveHandleNotice -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem - -ftp: - host: 172.27.3.135 - port: 6318 - -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? \ No newline at end of file +#logging: +# config: ./config/logback.xml \ No newline at end of file diff --git a/capability/src/main/resources/bin/start.sh b/capability/src/main/resources/bin/start.sh index 6b7f161e..f58cebbc 100644 --- a/capability/src/main/resources/bin/start.sh +++ b/capability/src/main/resources/bin/start.sh @@ -42,7 +42,7 @@ fi echo "正在启动项目..." # 启动项目,保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5007 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5001 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/capability/src/main/resources/bin/startprod.sh b/capability/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..ac7a1a40 --- /dev/null +++ b/capability/src/main/resources/bin/startprod.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/capability" +JAR_NAME="capability-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/capability/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 检查Jar包是否存在 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +# 获取运行中的进程PID +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 启动服务 +check_jar_exists + +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +echo "正在启动项目..." + +# 启动项目,保留控制台输出 +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5001 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & + + + + diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index ad4563a8..ab2e4073 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -2344,8 +2344,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { if(ObjectUtils.isNotEmpty(taskBaseInfo)) { taskBaseInfo.setPoolId(fileSimulationMappingResp.getSimulationPoolId()); taskBaseInfo.setFileId(fileSimulationMappingResp.getFileId()); + result.add(taskBaseInfo); } - result.add(taskBaseInfo); } }); diff --git a/data/src/main/resources/application-prod.yml b/data/src/main/resources/application-prod.yml index 6ab9f71a..da206792 100644 --- a/data/src/main/resources/application-prod.yml +++ b/data/src/main/resources/application-prod.yml @@ -5,6 +5,10 @@ spring: application: name: data datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver hikari: # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 maximum-pool-size: 20 @@ -18,53 +22,22 @@ spring: connection-timeout: 30000 # 30s master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 + server-addr: 192.168.30.146:8848 group: PROD_GROUP -# server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848 enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 - data: - redis: - # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 - # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 - # redis端口(默认6379) - port: 6379 - #redis连接超时等待,10秒 - timeout: PT10S - # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - 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 servlet: multipart: # 单个文件的最大值 @@ -72,11 +45,29 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + group: + readiness: + include: discoveryComposite,ping,refreshScope + health: + redis: + enabled: false + db: + enabled: false + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # cache-enabled: true mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -86,53 +77,27 @@ mybatis-plus: # 删除后 logic-delete-value: 0 -#showSql -#logging: -# level: -# com.sdm.dao: debug +# MyBatis SQL日志配置 +logging: + level: + com.baomidou.mybatisplus.core.MybatisConfiguration: debug + com.baomidou.mybatisplus.core.override.MybatisMapperRegistry: trace + com.sdm.data.mapper: debug + java.sql: debug + java.sql.Connection: debug + java.sql.Statement: debug + java.sql.PreparedStatement: debug lombok: anyConstructor: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm + privatePath: /data/home -hpc: - url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 - -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem - -ftp: - host: 172.27.3.135 - port: 6318 - -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? +#logging: +# config: ./config/logback.xml # 配置文件系统类型 fileSystem: @@ -140,15 +105,9 @@ fileSystem: system: system chose: minio # 这里选择minio或者system -#地址: https://play.min.io -#凭据: -#账号: minioadmin / 密码: minioadmin -#特点: -#由 MinIO 官方提供,用于演示和测试。 -#公开可访问,但数据可能定期清理。 -#支持 S3 API,适合快速验证代码 +# spdmadmin/spdmadmin 作为普通用户只能看到spdm桶的数据 minio: - endpoint: 192.168.65.161 + endpoint: 192.168.30.146 port: 9000 access-key: minioadmin secret-key: minioadmin @@ -156,8 +115,18 @@ minio: secret-business-bucket: secretbusiness # 存放保密业务代码、脚本的桶(仅超级管理员访问) spdm-bucket: spdm # 普通业务数据桶(分配给用户读写权限) directMemory: 16384 # 16kb + lifecycleConfig: '{"auto-expire-1d":"1d"}' security: whitelist: paths: - - /data/previewImage \ No newline at end of file + - /data/previewImage + - /data/approveDataFile + - /data/downloadFile + - /data/flowableUpFileToLocal + - /data/flowableUpFileToLocalMerge + - /data/getFileBaseInfo + +data: + storage-monitor: + cron: 0 0 9 * * ? \ No newline at end of file diff --git a/data/src/main/resources/bin/start.sh b/data/src/main/resources/bin/start.sh index aee77ae7..cdd31c2b 100644 --- a/data/src/main/resources/bin/start.sh +++ b/data/src/main/resources/bin/start.sh @@ -42,4 +42,4 @@ fi # 启动项目 echo "正在启动项目..." -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & \ No newline at end of file +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5002 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & \ No newline at end of file diff --git a/data/src/main/resources/bin/startprod.sh b/data/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..aefd9623 --- /dev/null +++ b/data/src/main/resources/bin/startprod.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/data" +JAR_NAME="data-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/data/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 检查是否已运行 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 检查Jar包是否存在 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + + +# 启动项目 +echo "正在启动项目..." +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5002 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java b/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java index 5f97a622..f554727c 100644 --- a/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java +++ b/flowable/src/main/java/com/sdm/flowable/controller/ProcessController.java @@ -128,6 +128,37 @@ public class ProcessController implements IFlowableFeignClient { return SdmResponse.success(processInstanceResp); } + + /** + * 挂起流程实例 + * @param processInstanceId 流程实例ID + * @return + */ + @GetMapping("/suspendProcessInstance") + SdmResponse suspendProcessInstance(@RequestParam String processInstanceId){ + return processService.suspendProcessInstance(processInstanceId); + } + + /** + * 激活流程实例 + * @param processInstanceId 流程实例ID + * @return + */ + @GetMapping("/activateProcessInstance") + SdmResponse activateProcessInstance(@RequestParam String processInstanceId){ + return processService.activateProcessInstance(processInstanceId); + } + + /** + * 取消流程实例 + * @param processInstanceId 流程实例ID + * @return + */ + @GetMapping("/cancelProcessInstance") + SdmResponse cancelProcessInstance(@RequestParam String processInstanceId){ + return processService.cancelProcessInstance(processInstanceId); + } + /** * 查询流程实例及所有节点的详细状态(返回结构化 DTO) * 如果只传了processDefinitionId,根据流程定义返回流程基本信息和节点信息, diff --git a/flowable/src/main/java/com/sdm/flowable/process/Iprocess.java b/flowable/src/main/java/com/sdm/flowable/process/Iprocess.java new file mode 100644 index 00000000..eed11b41 --- /dev/null +++ b/flowable/src/main/java/com/sdm/flowable/process/Iprocess.java @@ -0,0 +1,46 @@ +package com.sdm.flowable.process; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO; +import com.sdm.common.entity.req.flowable.AsyncCallbackRequest; +import com.sdm.common.entity.resp.flowable.DeployFlowableResp; +import com.sdm.common.entity.resp.flowable.ProcessInstanceDetailResponse; +import com.sdm.flowable.dto.req.CompleteTaskReq; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.validation.ValidationError; + +import java.util.*; + +public interface Iprocess { + // 验证并返回模型验证错误信息 + List validateModel(ProcessDefinitionDTO processDTO) throws Exception; + + // 部署流程(前端传入Flowable标准JSON) + SdmResponse deploy(ProcessDefinitionDTO processDTO) throws Exception; + + void deleteAllDeployments(); + + ProcessInstance startByProcessDefinitionId(String processDefinitionId, Map variables); + + SdmResponse suspendProcessInstance(String processInstanceId); + + SdmResponse activateProcessInstance(String processInstanceId); + + SdmResponse cancelProcessInstance(String processInstanceId); + + /** + * 查询流程实例及所有节点的详细状态(返回结构化 DTO) + * 如果只传了processDefinitionId,根据流程定义返回流程基本信息和节点信息, + * 如果还传了processInstanceId,再封装流程状态和节点状态 + */ + SdmResponse getProcessAndNodeDetailByInstanceId(String processDefinitionId, String processInstanceId, String runId); + + + SdmResponse continueServiceTask( CompleteTaskReq req); + + SdmResponse asyncCallback(AsyncCallbackRequest request); + + SdmResponse retryFailedNode( String processInstanceId, String failNodeId); + + SdmResponse retryToNode(String procInstId, String targetNodeId, Map newVariables); +} diff --git a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java index 67e00c52..e63c2adc 100644 --- a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java +++ b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java @@ -44,7 +44,7 @@ import java.util.stream.Collectors; @Slf4j @Service -public class ProcessService { +public class ProcessService implements Iprocess{ @Autowired private RepositoryService repositoryService; @@ -136,6 +136,99 @@ public class ProcessService { return instance; } + + /** + * 挂起流程实例 + */ + public SdmResponse suspendProcessInstance(String processInstanceId) { + log.info("请求挂起流程实例: {}", processInstanceId); + try { + // 检查流程是否存在且处于运行状态 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + + if (processInstance == null) { + return SdmResponse.failed("流程实例不存在或已结束,无法挂起"); + } + + if (processInstance.isSuspended()) { + return SdmResponse.failed("流程实例已经是挂起状态"); + } + + runtimeService.suspendProcessInstanceById(processInstanceId); + log.info("流程实例挂起成功: {}", processInstanceId); + return SdmResponse.success("流程实例挂起成功"); + } catch (Exception e) { + log.error("挂起流程实例失败: {}", e.getMessage(), e); + return SdmResponse.failed("挂起流程实例失败"); + } + } + + /** + * 激活流程实例 + */ + public SdmResponse activateProcessInstance(String processInstanceId) { + log.info("请求激活流程实例: {}", processInstanceId); + try { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + + if (processInstance == null) { + return SdmResponse.failed("流程实例不存在或已结束,无法激活"); + } + + if (!processInstance.isSuspended()) { + return SdmResponse.failed("流程实例已经是激活状态"); + } + + runtimeService.activateProcessInstanceById(processInstanceId); + log.info("流程实例激活成功: {}", processInstanceId); + return SdmResponse.success(); + } catch (Exception e) { + log.error("激活流程实例失败: {}", e.getMessage(), e); + return SdmResponse.failed("激活流程实例失败 "); + } + } + + /** + * 取消/终止流程实例 + * @param processInstanceId 流程实例ID + */ + public SdmResponse cancelProcessInstance(String processInstanceId) { + log.info("请求取消/终止流程实例: {}", processInstanceId); + try { + // 1. 检查流程是否正在运行 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + + if (processInstance == null) { + // 如果运行时查不到,可能已经结束了,或者不存在 + // 进一步去历史查一下,明确告知用户 + HistoricProcessInstance history = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + if (history != null) { + return SdmResponse.failed("该流程实例已经结束,无法取消"); + } else { + return SdmResponse.failed("流程实例不存在"); + } + } + + // 2. 执行删除(在Flowable中,终止运行中的流程就是删除运行时数据) + // 参数1: ID, 参数2: 删除原因 (会被写入历史表的 DELETE_REASON_ 字段) + runtimeService.deleteProcessInstance(processInstanceId, ""); + + log.info("流程实例已取消: {}", processInstanceId); + return SdmResponse.success("流程实例已取消"); + } catch (Exception e) { + log.error("取消流程实例失败: {}", e.getMessage(), e); + return SdmResponse.failed("取消流程实例失败" ); + } + } + // 验证并返回模型验证错误信息 public List validateModel(ProcessDefinitionDTO processDTO) throws Exception { BpmnModel bpmnModel = dto2BpmnConverter.convert(processDTO); @@ -150,66 +243,73 @@ public class ProcessService { */ public SdmResponse getProcessAndNodeDetailByInstanceId(String processDefinitionId, String processInstanceId, String runId) { ProcessInstanceDetailResponse response = new ProcessInstanceDetailResponse(); - - // 构建基础流程信息 + + // 基础流程信息 ProcessInstanceInfo processInfo = new ProcessInstanceInfo(); processInfo.setProcessDefinitionId(processDefinitionId); - - // 获取流程定义中的节点结构信息 + + // 获取节点结构 List orderedNodes = getOrderedFlowNodes(processDefinitionId); List nodes = orderedNodes.stream() - .map(this::buildNodeDetailInfoFromFlowNode) // 直接构建NodeDetailInfo + .map(this::buildNodeDetailInfoFromFlowNode) .peek(detail -> { JSONObject params = processNodeParamService.getParam(processDefinitionId, detail.getId(), runId); detail.setUserParam(params); }) .collect(Collectors.toList()); - + if (processInstanceId != null && !processInstanceId.isEmpty()) { - // 如果提供了流程实例ID,则补充完整状态信息 - processInfo = buildProcessInstanceInfo(processInstanceId); - - // 补充节点状态信息 + // --- 状态判断逻辑开始 --- + + // 1. 获取运行时流程实例对象(判断是否运行中、是否挂起) + ProcessInstance runtimeInstance = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + + boolean isRunning = (runtimeInstance != null); + boolean isProcessSuspended = isRunning && runtimeInstance.isSuspended(); + + // 2. 准备历史数据 List historicActivities = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .list(); - // 为了处理多实例或循环,最好按结束时间倒序排,取最新的 Map activityMap = new HashMap<>(); for (HistoricActivityInstance hist : historicActivities) { - // 如果Map里已经有了,且当前的开始时间比Map里的晚,则覆盖(取最新的) if (!activityMap.containsKey(hist.getActivityId()) || hist.getStartTime().after(activityMap.get(hist.getActivityId()).getStartTime())) { activityMap.put(hist.getActivityId(), hist); } } - List activeActivityIds = isProcessRunning(processInstanceId) + // 3. 准备运行时 Active ID 列表 + List activeActivityIds = isRunning ? runtimeService.getActiveActivityIds(processInstanceId) : Collections.emptyList(); - // 获取异常/失败的任务信息 - // Map + // 4. 准备异常信息 (DeadLetterJob 代表严重错误/失败) Map errorMap = new HashMap<>(); - if (isProcessRunning(processInstanceId)) { - // 1. 查询死信作业 (DeadLetterJob) - 重试次数用尽,彻底失败 + boolean hasDeadLetterJobs = false; // 标记流程是否有死信 + + if (isRunning) { + // 死信作业 (DeadLetterJob) - 彻底失败 List deadJobs = managementService.createDeadLetterJobQuery() .processInstanceId(processInstanceId).list(); + if (!deadJobs.isEmpty()) { + hasDeadLetterJobs = true; + } - // 2. 查询普通作业 (Job) - 包含正在重试中的异常 (exceptionMessage不为空) + // 普通作业 (Job) - 包含重试中的异常 List activeJobs = managementService.createJobQuery() .processInstanceId(processInstanceId).list(); - // 3. 辅助查询:获取 Execution 以便将 Job 映射到 ActivityId - // Job 对象里通常只有 executionId,我们需要知道这个 execution 当前在哪个 activityId + // 映射 ExecutionId -> ActivityId List executions = runtimeService.createExecutionQuery() .processInstanceId(processInstanceId).list(); Map executionToActivityMap = executions.stream() - // 【关键】过滤掉 activityId 为 null 的记录,根执行实例(Root Execution):代表流程实例本身的那条记录,它的 activityId 通常是 null .filter(e -> e.getActivityId() != null) .collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1)); - // 填充错误 Map Consumer mapJobToError = job -> { if (job.getExceptionMessage() != null) { String activityId = executionToActivityMap.get(job.getExecutionId()); @@ -218,32 +318,38 @@ public class ProcessService { } } }; - deadJobs.forEach(mapJobToError); activeJobs.forEach(mapJobToError); } + // --- 5. 构建流程实例级状态 (ProcessInfo) --- + // 这里传入新的状态标志:hasDeadLetterJobs, isProcessSuspended + processInfo = buildProcessInstanceInfo(processInstanceId, isRunning, isProcessSuspended, hasDeadLetterJobs); - // 更新节点状态信息,遍历节点设置状态,并处理 ServiceTask + ReceiveTask 的合并逻辑 + // --- 6. 构建节点级状态 --- for (NodeDetailInfo node : nodes) { String originalNodeId = node.getId(); - // 4.1 获取当前节点的物理状态 HistoricActivityInstance myHist = activityMap.get(originalNodeId); boolean isActive = activeActivityIds.contains(originalNodeId); boolean isFinished = myHist != null && myHist.getEndTime() != null; - // 判断该节点是否有报错 String errorMessage = errorMap.get(originalNodeId); boolean isError = errorMessage != null; - // 初始状态判定 (优先级:Error > Finished > Active > Pending) + // 优先级判断状态 String displayStatus; + if (isError) { - displayStatus = "error"; + displayStatus = "error"; // 节点报错优先 + } else if (isActive) { + // 【优化点】:如果节点是 Active,但流程是 Suspended,则节点状态为 suspended + if (isProcessSuspended) { + displayStatus = "suspended"; + } else { + displayStatus = "active"; + } } else if (isFinished) { displayStatus = "finished"; - } else if (isActive) { - displayStatus = "active"; } else { displayStatus = "pending"; } @@ -252,22 +358,19 @@ public class ProcessService { Date endTime = myHist != null ? myHist.getEndTime() : null; Long duration = myHist != null ? myHist.getDurationInMillis() : null; - // 4.2 特殊处理:检查是否为异步回调的 ServiceTask + // ServiceTask 异步回调逻辑特殊处理 (保持原有逻辑,叠加挂起判断) if (isAsyncCallbackNode(node)) { - // 如果原始节点本身就报错了(ServiceTask 执行 JavaDelegate 时抛出异常) - // 此时还没走到 ReceiveTask,所以直接显示 Error if (isError) { - node.setErrorMessage(errorMessage); // 假设 NodeDetailInfo 有这个字段 - // 保持 displayStatus = "error" + node.setErrorMessage(errorMessage); } else { - // 原有逻辑:推算 ReceiveTask String waitNodeId = FlowNodeIdUtils.generateAsyncTaskId(originalNodeId); HistoricActivityInstance waitHist = activityMap.get(waitNodeId); boolean waitIsActive = activeActivityIds.contains(waitNodeId); boolean waitIsFinished = waitHist != null && waitHist.getEndTime() != null; if (waitIsActive) { - displayStatus = "active"; + // 同样:如果 ReceiveTask 等待中,但流程挂起,显示挂起 + displayStatus = isProcessSuspended ? "suspended" : "active"; endTime = null; if (startTime != null) { duration = System.currentTimeMillis() - startTime.getTime(); @@ -279,19 +382,16 @@ public class ProcessService { duration = endTime.getTime() - startTime.getTime(); } } else if (isFinished && !waitIsFinished && !waitIsActive) { - // 极短时间差 - displayStatus = "active"; + displayStatus = isProcessSuspended ? "suspended" : "active"; endTime = null; } } } else { - // 非特殊节点,如果是 Error 状态,填充错误信息 if (isError) { node.setErrorMessage(errorMessage); } } - // 4.3 赋值给 DTO node.setStatus(displayStatus); node.setStartTime(startTime); node.setEndTime(endTime); @@ -301,14 +401,14 @@ public class ProcessService { } } } - + response.setProcessInfo(processInfo); response.setNodes(nodes); return SdmResponse.success(response); } // 构建流程实例信息 - private ProcessInstanceInfo buildProcessInstanceInfo(String processInstanceId) { + private ProcessInstanceInfo buildProcessInstanceInfo(String processInstanceId, boolean isRunning, boolean isSuspended, boolean hasError) { HistoricProcessInstance historicInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); @@ -317,23 +417,46 @@ public class ProcessService { throw new RuntimeException("流程实例不存在: " + processInstanceId); } - boolean isRunning = runtimeService.createProcessInstanceQuery() - .processInstanceId(processInstanceId) - .count() > 0; - ProcessInstanceInfo info = new ProcessInstanceInfo(); info.setProcessInstanceId(historicInstance.getId()); info.setProcessDefinitionId(historicInstance.getProcessDefinitionId()); info.setStartTime(historicInstance.getStartTime()); - info.setEndTime(historicInstance.getEndTime()); // 可能为 null + info.setEndTime(historicInstance.getEndTime()); + // 计算耗时 Long duration = historicInstance.getDurationInMillis(); if (duration == null && historicInstance.getStartTime() != null && isRunning) { duration = System.currentTimeMillis() - historicInstance.getStartTime().getTime(); } info.setDurationInMillis(duration); info.setDurationFormatted(duration != null ? formatDuration(duration) : null); - info.setStatus(isRunning ? "running" : "completed"); + + // 【优化点】:设置流程状态 + // 优先级:Error > Suspended > Running > Completed + String status; + if (isRunning) { + // --- 运行中 --- + if (hasError) { + status = "error"; // 有死信作业,视为异常 + } else if (isSuspended) { + status = "suspended"; // 被挂起 + } else { + status = "running"; // 正常运行 + } + } else { + // --- 已结束 (运行时查不到,历史表里有) --- + String deleteReason = historicInstance.getDeleteReason(); + + if (deleteReason == null) { + // 1. 正常走完结束节点,deleteReason 为空 + status = "completed"; + } else { + // 2. 有删除原因,说明是被取消或强制终止的 + // 你可以根据 reason 的内容做更细的区分,或者统称为 cancelled + status = "cancelled"; + } + } + info.setStatus(status); return info; } @@ -507,11 +630,12 @@ public class ProcessService { return SdmResponse.success(); } - public void asyncCallback(AsyncCallbackRequest request) { + public SdmResponse asyncCallback(AsyncCallbackRequest request) { log.info("接收到异步回调请求, 请求内容: {}", request); // 发送信号唤醒流程实例中等待的节点 universalDelegate.signalByTaskId(request); log.info("异步回调处理转发完成, 任务ID: {}", request.getAsyncTaskId()); + return SdmResponse.success(); } /** @@ -552,13 +676,14 @@ public class ProcessService { .orElseThrow(() -> new RuntimeException("在死信队列中未找到节点 [" + activityId + "] 的作业")); } - public void retryFailedNode( String processInstanceId,String failNodeId) { + public SdmResponse retryFailedNode( String processInstanceId,String failNodeId) { try { // 2. 查找 Job ID (参考上面的代码) String jobId = findDeadJobId(processInstanceId, failNodeId); // 3. 执行重试 - managementService.moveDeadLetterJobToExecutableJob(jobId, 3); + managementService.moveDeadLetterJobToExecutableJob(jobId, 1); log.info("作业已恢复,等待异步执行器拾取执行..."); + return SdmResponse.success("重试任务已提交"); } catch (Exception e) { log.error("重试节点失败, 流程ID: {}, 节点ID: {}, 异常信息: {}", processInstanceId, failNodeId, e.getMessage(), e); throw new RuntimeException("重试失败"); @@ -572,7 +697,7 @@ public class ProcessService { * @param targetNodeId 目标节点ID * @param newVariables 新的变量参数 */ - public void retryToNode(String procInstId, String targetNodeId, Map newVariables) { + public SdmResponse retryToNode(String procInstId, String targetNodeId, Map newVariables) { log.info("开始重试节点操作, 流程实例ID: {}, 目标节点ID: {}, 新变量数量: {}", procInstId, targetNodeId, newVariables != null ? newVariables.size() : 0); @@ -605,5 +730,6 @@ public class ProcessService { // 完成重试中转任务,触发 ExecutionListener taskService.complete(retryTask.getId()); log.info("重试中转任务完成, 任务ID: {}", retryTask.getId()); + return SdmResponse.success("重试任务已提交"); } } \ No newline at end of file diff --git a/flowable/src/main/resources/application-prod.yml b/flowable/src/main/resources/application-prod.yml new file mode 100644 index 00000000..d0f9168b --- /dev/null +++ b/flowable/src/main/resources/application-prod.yml @@ -0,0 +1,40 @@ +server: + port: 7106 +spring: + application: + name: flowable + datasource: + url: jdbc:mysql://192.168.30.146:3306/flowable?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + username: root + password: mysql + driver-class-name: com.mysql.cj.jdbc.Driver + flowable: + # ????????? + database-schema-update: true + # ??????JOB + async-executor-activate: true + cloud: + nacos: + discovery: + server-addr: 192.168.30.146:8848 + group: PROD_GROUP + enabled: true + +logging: + level: + org: + flowable: INFO + +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + type-aliases-package: com.sdm.flowable.model.entity + configuration: + map-underscore-to-camel-case: true + global-config: + db-config: + id-type: auto +security: + whitelist: + paths: + - /process/testHpc + - /process/asyncCallback diff --git a/flowable/src/main/resources/bin/start.sh b/flowable/src/main/resources/bin/start.sh index 4174ced7..2d6c67a9 100644 --- a/flowable/src/main/resources/bin/start.sh +++ b/flowable/src/main/resources/bin/start.sh @@ -42,4 +42,4 @@ fi # 启动项目 echo "正在启动项目..." -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5003 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/flowable/src/main/resources/bin/startprod.sh b/flowable/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..557e79ce --- /dev/null +++ b/flowable/src/main/resources/bin/startprod.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/flowable" +JAR_NAME="flowable-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/flowable/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 检查是否已运行 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 检查Jar包是否存在 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + + +# 启动项目 +echo "正在启动项目..." +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5003 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/gateway2/src/main/resources/application-prod.yml b/gateway2/src/main/resources/application-prod.yml index 9d6d15d4..b98bdb2e 100644 --- a/gateway2/src/main/resources/application-prod.yml +++ b/gateway2/src/main/resources/application-prod.yml @@ -7,12 +7,12 @@ spring: cloud: nacos: config: - server-addr: 192.168.65.161:8848 + server-addr: 192.168.30.146:8848 file-extension: yaml import-check: enabled: false discovery: - server-addr: 192.168.65.161:8848 + server-addr: 192.168.30.146:8848 group: PROD_GROUP enabled: true gateway: @@ -83,7 +83,7 @@ spring: filters: - StripPrefix=2 metadata: - group: LOCAL_GROUP # 指定目标服务的分组 + group: PROD_GROUP # 指定目标服务的分组 discovery: locator: enabled: true @@ -93,18 +93,18 @@ management: endpoints: web: exposure: - include: health,info,metrics,logfile + include: health,info endpoint: health: show-details: always - enabled: true - probes: - enabled: true - info: - enabled: true - info: - env: - enabled: true + group: + readiness: + include: discoveryComposite,ping,refreshScope + health: + redis: + enabled: false + db: + enabled: false logging: level: @@ -114,5 +114,10 @@ logging: # 0单机处理,1负载均衡轮询 serverType: 0 -serverIp: 192.168.65.161 -#serverIp: 192.168.65.73 \ No newline at end of file +serverIp: 192.168.30.146 +#serverIp: 192.168.65.73 + +security: + whitelist: + paths: + - aa \ No newline at end of file diff --git a/gateway2/src/main/resources/bin/startprod.sh b/gateway2/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..3210048e --- /dev/null +++ b/gateway2/src/main/resources/bin/startprod.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# Spring Boot 网关项目启动脚本 +JAR_PATH="/home/app/gateway2" +JAR_NAME="gateway2-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/gateway2/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xmx2g -Xms2g -XX:MaxDirectMemorySize=2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + + + +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 检查jar包是否存在 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +# 启动项目 +echo "正在启动项目..." +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & + + diff --git a/pbs/src/main/resources/application-prod.yml b/pbs/src/main/resources/application-prod.yml index 874de2e2..4c1bb36a 100644 --- a/pbs/src/main/resources/application-prod.yml +++ b/pbs/src/main/resources/application-prod.yml @@ -5,40 +5,53 @@ spring: application: name: pbs datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 + maximum-pool-size: 20 + # 连接池在空闲时保持的最小连接数。 + minimum-idle: 5 + # 一个连接在被标记为空闲之前可以保持空闲状态的最长时间(毫秒)。当连接的空闲时间超过此值后,它可能会被连接池 evict(驱逐)。 + idle-timeout: 60000 # 1 min + # 一个连接从被创建开始,其生命周期的最大时长(毫秒)。HikariCP的默认值就是30分钟,这是一个非常合理的设置。 + max-lifetime: 1800000 # 30 min(Hikari 默认) + # 应用程序尝试从连接池获取一个连接时,等待的最长时间(毫秒)。建议值:30-60秒。 + connection-timeout: 30000 # 30s master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 -# server-addr: 127.0.0.1:8848 + server-addr: 192.168.30.146:8848 + group: PROD_GROUP enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 + # namespace: 3 + # username: nacos + # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 + database: 0 # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 timeout: PT10S # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + password: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 @@ -49,10 +62,10 @@ spring: 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 + # password: + # sentinel: + # master: mymaster + # nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 servlet: multipart: # 单个文件的最大值 @@ -60,11 +73,21 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # cache-enabled: true + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -84,40 +107,35 @@ lombok: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm hpc: url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 + # 这个是spdm mock执行cmd命令 + # 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 -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem -ftp: - host: 172.27.3.135 - port: 6318 +#logging: +# config: ./config/logback.xml +# pbs 作业提交相关配置 +pbs: + task: + hpc: hpc + qusb: qusb + impl: hpc -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? \ No newline at end of file +security: + whitelist: + paths: + - /pbs/jobFileCallback + - /pbs/netTest + - /pbs/adapterSubmitHpcJob \ No newline at end of file diff --git a/pbs/src/main/resources/bin/log.sh b/pbs/src/main/resources/bin/log.sh new file mode 100644 index 00000000..5b0f38d2 --- /dev/null +++ b/pbs/src/main/resources/bin/log.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Spring Boot 项目日志查看脚本 +LOG_HOME="/home/app/pbs/logs" +LOG_FILE="${LOG_HOME}/running.log" + + +# 查看实时日志 +if [ ! -f "${LOG_FILE}" ]; then + echo "日志文件不存在:${LOG_FILE}(可能项目未启动)" + exit 1 +fi +echo "正在查看实时运行日志(按 Ctrl+C 退出)... 日志路径:${LOG_FILE}" +tail -f "${LOG_FILE}" diff --git a/pbs/src/main/resources/bin/restart.sh b/pbs/src/main/resources/bin/restart.sh new file mode 100644 index 00000000..82f7899a --- /dev/null +++ b/pbs/src/main/resources/bin/restart.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Spring Boot 项目重启脚本 + +# 定义基础路径(公共参数) +BASE_DIR="/home/app/pbs" + +echo "=== 开始重启项目 ===" + +# 先停止服务 +if [ -f "${BASE_DIR}/stop.sh" ]; then + "${BASE_DIR}/stop.sh" +else + echo "错误:未找到停止脚本 ${BASE_DIR}/stop.sh" + exit 1 +fi + +# 再启动服务 +if [ -f "${BASE_DIR}/start.sh" ]; then + "${BASE_DIR}/start.sh" +else + echo "错误:未找到启动脚本 ${BASE_DIR}/start.sh" + exit 1 +fi + +echo "=== 重启操作完成 ===" \ No newline at end of file diff --git a/pbs/src/main/resources/bin/start.sh b/pbs/src/main/resources/bin/start.sh new file mode 100644 index 00000000..e7c6ee4d --- /dev/null +++ b/pbs/src/main/resources/bin/start.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/pbs" +JAR_NAME="pbs-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/pbs/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 检查是否已运行 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 检查Jar包是否存在 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + + +# 启动项目 +echo "正在启动项目..." +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5004 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/pbs/src/main/resources/bin/startprod.sh b/pbs/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..e7c6ee4d --- /dev/null +++ b/pbs/src/main/resources/bin/startprod.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/pbs" +JAR_NAME="pbs-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/pbs/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 检查是否已运行 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 检查Jar包是否存在 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + + +# 启动项目 +echo "正在启动项目..." +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5004 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/pbs/src/main/resources/bin/status.sh b/pbs/src/main/resources/bin/status.sh new file mode 100644 index 00000000..66701385 --- /dev/null +++ b/pbs/src/main/resources/bin/status.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Spring Boot 项目状态查询脚本 +JAR_NAME="pbs-0.0.1-SNAPSHOT.jar" +LOG_HOME="/home/app/pbs/logs" +LOG_FILE="${LOG_HOME}/running.log" + + +# 函数定义 +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 查看服务状态 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目运行中!PID: ${PID}" + echo "日志文件路径:${LOG_FILE}" +else + echo "项目未在运行中" +fi diff --git a/pbs/src/main/resources/bin/stop.sh b/pbs/src/main/resources/bin/stop.sh new file mode 100644 index 00000000..f42b3392 --- /dev/null +++ b/pbs/src/main/resources/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Spring Boot 项目强制停止脚本 +JAR_NAME="pbs-0.0.1-SNAPSHOT.jar" + +# 函数定义:获取运行中的进程ID +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 获取进程ID +PID=$(get_running_pid) + +# 检查进程是否存在 +if [ -z "${PID}" ]; then + echo "项目未在运行中,无需停止" + exit 0 +fi + +# 强制停止进程 +echo "正在强制停止项目... PID: ${PID}" +kill -9 "${PID}" + +# 检查是否成功停止 +sleep 5 +if [ -z "$(get_running_pid)" ]; then + echo "项目已强制停止成功" + exit 0 +else + echo "ERROR: 进程终止失败!请手动检查:ps -ef | grep ${JAR_NAME}" + exit 1 +fi diff --git a/project/src/main/resources/application-prod.yml b/project/src/main/resources/application-prod.yml index 1b12e489..5f80bd8c 100644 --- a/project/src/main/resources/application-prod.yml +++ b/project/src/main/resources/application-prod.yml @@ -1,10 +1,14 @@ server: - port: 7107 + port: 7101 spring: application: name: project datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver hikari: # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 maximum-pool-size: 20 @@ -18,38 +22,35 @@ spring: connection-timeout: 30000 # 30s master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 - group: PROD_GROUP + server-addr: 192.168.30.146:8848 enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 + group: PROD_GROUP + # username: nacos + # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 + database: 0 # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 timeout: PT10S # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + password: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 @@ -60,10 +61,10 @@ spring: 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 + # password: + # sentinel: + # master: mymaster + # nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 servlet: multipart: # 单个文件的最大值 @@ -71,11 +72,29 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + group: + readiness: + include: discoveryComposite,ping,refreshScope + health: + redis: + enabled: false + db: + enabled: false + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + cache-enabled: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -86,49 +105,22 @@ mybatis-plus: logic-delete-value: 0 #showSql -#logging: -# level: -# com.sdm.dao: debug +logging: + level: + com.sdm.dao: debug lombok: anyConstructor: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm -hpc: - url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 - -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem - -ftp: - host: 172.27.3.135 - port: 6318 - -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? \ No newline at end of file +security: + whitelist: + paths: + - /run/deliverableApproveCallback + - /run/getSimulationKeyResultFileIds + - /run/generateReportInternal +#logging: +# config: ./config/logback.xml \ No newline at end of file diff --git a/project/src/main/resources/bin/start.sh b/project/src/main/resources/bin/start.sh index 48bc7973..0c88247e 100644 --- a/project/src/main/resources/bin/start.sh +++ b/project/src/main/resources/bin/start.sh @@ -42,4 +42,4 @@ fi echo "正在启动项目... " # 启动项目并保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/project/src/main/resources/bin/startprod.sh b/project/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..0c88247e --- /dev/null +++ b/project/src/main/resources/bin/startprod.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/project" +JAR_NAME="project-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/project/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 检查是否已运行 +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 启动服务 +check_jar_exists + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +echo "正在启动项目... " + +# 启动项目并保留控制台输出 +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/restart_all.sh b/restart_all.sh new file mode 100644 index 00000000..ff6b2b45 --- /dev/null +++ b/restart_all.sh @@ -0,0 +1,40 @@ + #!/bin/bash + + # 定义要重启的目录顺序(与启动顺序一致) + directories=("capability" "data" "flowable" "gateway2" "pbs" "system" "task" "project") + base_dir="/home/app" + + # 遍历目录并执行restart.sh + for dir in "${directories[@]}"; do + script_path="${base_dir}/${dir}/restart.sh" + + # 检查脚本是否存在 + if [ -f "$script_path" ]; then + echo "正在重启 ${dir} 服务..." + + # 检查脚本是否可执行,如不可执行则添加执行权限 + if [ ! -x "$script_path" ]; then + echo "为 ${script_path} 添加执行权限..." + chmod +x "$script_path" + fi + + # 执行重启脚本 + "$script_path" + + # 检查上一个命令的执行结果 + if [ $? -eq 0 ]; then + echo "${dir} 服务重启成功" + else + echo "错误: ${dir} 服务重启失败,终止后续重启流程" + exit 1 # 重启失败时退出脚本,不再继续 + fi + else + echo "错误: ${script_path} 不存在,终止重启流程" + exit 1 # 脚本不存在时也退出 + fi + + echo "----------------------------------------" + done + + echo "所有服务重启成功" + \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..6c0a5a80 --- /dev/null +++ b/start.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Spring Boot 项目启动脚本(不修改logback配置,实时打印日志) +JAR_PATH="/home/app/system" +JAR_NAME="system-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/system/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 启动服务 +check_jar_exists + +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +echo "正在启动项目..." + +# 启动项目,保留控制台输出 +nohup java ${JVM_OPTS} -jar "${FULL_JAR_PATH}" --spring.profiles.active=dev > "${LOG_FILE}" 2>&1 & + diff --git a/start_all.sh b/start_all.sh new file mode 100644 index 00000000..3c128e77 --- /dev/null +++ b/start_all.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# 定义要启动的目录顺序 +directories=("capability" "data" "flowable" "gateway2" "pbs" "system" "task" "project") +base_dir="/home/app" + +# 遍历目录并执行start.sh(传递--silent参数) +for dir in "${directories[@]}"; do + script_path="${base_dir}/${dir}/start.sh" + + # 检查脚本是否存在 + if [ -f "$script_path" ]; then + echo "正在启动 ${dir} 服务..." + + # 检查脚本是否可执行 + if [ ! -x "$script_path" ]; then + echo "为 ${script_path} 添加执行权限..." + chmod +x "$script_path" + fi + + # 传递--silent参数启动,不显示实时日志 + "$script_path" --silent + + # 检查执行结果 + if [ $? -eq 0 ]; then + echo "${dir} 服务启动成功" + else + echo "错误: ${dir} 服务启动失败,终止后续启动流程" + exit 1 + fi + else + echo "错误: ${script_path} 不存在,终止启动流程" + exit 1 + fi + + echo "----------------------------------------" +done + +echo "所有服务启动成功" + + \ No newline at end of file diff --git a/stop_all.sh b/stop_all.sh new file mode 100644 index 00000000..39308449 --- /dev/null +++ b/stop_all.sh @@ -0,0 +1,49 @@ + #!/bin/bash + + # 定义要停止的目录顺序(可以根据需要调整顺序) + directories=("capability" "data" "flowable" "gateway2" "pbs" "system" "task" "project") + base_dir="/home/app" + # 记录是否有失败的停止操作 + has_error=0 + + # 遍历目录并执行stop.sh + for dir in "${directories[@]}"; do + script_path="${base_dir}/${dir}/stop.sh" + + # 检查脚本是否存在 + if [ -f "$script_path" ]; then + echo "正在停止 ${dir} 服务..." + + # 检查脚本是否可执行,如不可执行则添加执行权限 + if [ ! -x "$script_path" ]; then + echo "为 ${script_path} 添加执行权限..." + chmod +x "$script_path" + fi + + # 执行停止脚本 + "$script_path" + + # 检查上一个命令的执行结果 + if [ $? -eq 0 ]; then + echo "${dir} 服务停止成功" + else + echo "警告: ${dir} 服务停止失败" + has_error=1 # 标记有错误发生 + fi + else + echo "警告: ${script_path} 不存在,跳过该服务" + has_error=1 # 标记有错误发生 + fi + + echo "----------------------------------------" + done + + # 根据是否有错误返回不同的退出码 + if [ $has_error -eq 0 ]; then + echo "所有服务停止成功" + exit 0 + else + echo "部分服务停止失败,请检查" + exit 1 + fi + \ No newline at end of file diff --git a/system/src/main/resources/application-prod.yml b/system/src/main/resources/application-prod.yml index 66c32c37..210827e6 100644 --- a/system/src/main/resources/application-prod.yml +++ b/system/src/main/resources/application-prod.yml @@ -1,10 +1,14 @@ server: - port: 7107 + port: 7103 spring: application: name: system datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver hikari: # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 maximum-pool-size: 20 @@ -18,39 +22,34 @@ spring: connection-timeout: 30000 # 30s master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 + server-addr: 192.168.30.146:8848 group: PROD_GROUP -# server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848 enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 data: redis: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 + database: 0 # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 timeout: PT10S # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + password: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 @@ -61,10 +60,10 @@ spring: 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 + # password: + # sentinel: + # master: mymaster + # nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 servlet: multipart: # 单个文件的最大值 @@ -72,11 +71,29 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + group: + readiness: + include: discoveryComposite,ping,refreshScope + health: + redis: + enabled: false + db: + enabled: false + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # cache-enabled: true mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -86,53 +103,25 @@ mybatis-plus: # 删除后 logic-delete-value: 0 -#showSql -#logging: -# level: -# com.sdm.dao: debug +# MyBatis SQL日志配置 +logging: + level: + com.baomidou.mybatisplus.core.MybatisConfiguration: debug + com.baomidou.mybatisplus.core.override.MybatisMapperRegistry: trace + com.sdm.data.mapper: debug + java.sql: debug + java.sql.Connection: debug + java.sql.Statement: debug + java.sql.PreparedStatement: debug + lombok: anyConstructor: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm -hpc: - url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 - -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem - -ftp: - host: 172.27.3.135 - port: 6318 - -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? system: useCidSwitch: true @@ -151,7 +140,7 @@ tenantSystem: cid: url: http://192.168.65.162:8989/honeycom-spdm # 请根据实际CID服务地址修改 - ## url: http://192.168.65.75:8989/honeycom-spdm # 朱欣茹地址 + #url: http://192.168.65.75:8989/honeycom-spdm # 朱欣茹地址 user: listUser: /spdm-user/listUser queryUserDetail: /spdm-user/queryUserDetail @@ -169,7 +158,6 @@ cid: tenant: getTenantDetailById: /spdm-tenant/getTenantDetailById listTenant: /spdm-tenant/listTenant - flow: launchApprove: /spdm-flow/startFlow queryFlowTemplate: /spdm-flow/listProcessByGroup @@ -183,4 +171,11 @@ cid: msg: sendMessage: /spdm-msg/sendMessage log: - saveLog: /spdm-log/saveLog \ No newline at end of file + saveLog: /spdm-log/saveLog + +security: + whitelist: + paths: + - /systemApprove/approveStatusNotice + - /user/getUserToken + - /systemMsg/sendMessage \ No newline at end of file diff --git a/system/src/main/resources/bin/start.sh b/system/src/main/resources/bin/start.sh index 6bdf6053..b60925b8 100644 --- a/system/src/main/resources/bin/start.sh +++ b/system/src/main/resources/bin/start.sh @@ -42,5 +42,5 @@ fi echo "正在启动项目..." # 启动项目,保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/system/src/main/resources/bin/startprod.sh b/system/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..b60925b8 --- /dev/null +++ b/system/src/main/resources/bin/startprod.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Spring Boot 项目启动脚本(不修改logback配置,实时打印日志) +JAR_PATH="/home/app/system" +JAR_NAME="system-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/system/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + + +# 函数定义 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 启动服务 +check_jar_exists + +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +echo "正在启动项目..." + +# 启动项目,保留控制台输出 +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5006 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & + diff --git a/task/src/main/resources/application-prod.yml b/task/src/main/resources/application-prod.yml index 355c5369..0b7118c1 100644 --- a/task/src/main/resources/application-prod.yml +++ b/task/src/main/resources/application-prod.yml @@ -1,56 +1,58 @@ +# 前后端联调使用该配置文件,本地调试使用local server: - port: 7107 + port: 7102 spring: application: name: task datasource: + username: root + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver + hikari: + # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 + maximum-pool-size: 20 + # 连接池在空闲时保持的最小连接数。 + minimum-idle: 5 + # 一个连接在被标记为空闲之前可以保持空闲状态的最长时间(毫秒)。当连接的空闲时间超过此值后,它可能会被连接池 evict(驱逐)。 + idle-timeout: 60000 # 1 min + # 一个连接从被创建开始,其生命周期的最大时长(毫秒)。HikariCP的默认值就是30分钟,这是一个非常合理的设置。 + max-lifetime: 1800000 # 30 min(Hikari 默认) + # 应用程序尝试从连接池获取一个连接时,等待的最长时间(毫秒)。建议值:30-60秒。 + connection-timeout: 30000 # 30s master: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver - hikari: - # 设置连接池能够容纳的最大连接数。建议值:CPU核心数 * 2 + 有效磁盘I/O数。一个常见的经验值是 10-20。 - maximum-pool-size: 20 - # 连接池在空闲时保持的最小连接数。 - minimum-idle: 5 - # 一个连接在被标记为空闲之前可以保持空闲状态的最长时间(毫秒)。当连接的空闲时间超过此值后,它可能会被连接池 evict(驱逐)。 - idle-timeout: 60000 # 1 min - # 一个连接从被创建开始,其生命周期的最大时长(毫秒)。HikariCP的默认值就是30分钟,这是一个非常合理的设置。 - max-lifetime: 1800000 # 30 min(Hikari 默认) - # 应用程序尝试从连接池获取一个连接时,等待的最长时间(毫秒)。建议值:30-60秒。 - connection-timeout: 30000 # 30s slave: username: root - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - jdbc-url: jdbc:mysql://172.27.2.238:3306/spdm_prod?useUnicode=true&characterEncoding=utf-8&useSSL=true&clientCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/keystoremysql&clientCertificateKeyStorePassword=guangqi&trustCertificateKeyStoreUrl=file:/opt/spdm/mysql_ssl/truststoremysql&trustCertificateKeyStorePassword=guangqi&serverTimezone=Asia/Shanghai -# jdbc-url: jdbc:mysql://10.30.10.210:3306/spdm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai + password: mysql + jdbc-url: jdbc:mysql://192.168.30.146:3306/spdm_baseline?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver enable: true cloud: nacos: discovery: - server-addr: 172.27.2.238:8848 + server-addr: 192.168.30.146:8848 group: PROD_GROUP -# server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848 enabled: true - username: nacos - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) - namespace: 3 + # username: nacos + # password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) data: redis: # Redis默认情况下有16个分片(库),这里配置具体使用的分片,默认是0 - database: 1 + database: 0 # redis服务器地址(填写自己的服务器地址) - host: 172.27.2.238 + host: 192.168.2.166 # redis端口(默认6379) port: 6379 #redis连接超时等待,10秒 timeout: PT10S # redis访问密码(默认为空) - password: ENC(+QKYnI6gAYu1SbLaZQTkZA==) + password: lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 @@ -61,10 +63,10 @@ spring: 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 + # password: + # sentinel: + # master: mymaster + # nodes: 10.18.109.50:26379,10.18.109.51:26379,10.18.109.52:26379 servlet: multipart: # 单个文件的最大值 @@ -72,11 +74,29 @@ spring: # 上传文件总的最大值 max-request-size: 10240MB +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always + group: + readiness: + include: discoveryComposite,ping,refreshScope + health: + redis: + enabled: false + db: + enabled: false + mybatis-plus: configuration: map-underscore-to-camel-case: true auto-mapping-behavior: full -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # cache-enabled: true + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml global-config: # 逻辑删除配置 @@ -96,44 +116,15 @@ lombok: addConstructorProperties: true file: - rootPath: /SPDM/prod_server - viewDataPath: /SPDM/simright/viewdata + rootPath: /data/home/sdm scriptPath : /opt/script - -hpc: - url: http://172.27.3.135/JSONAPI/JSONAPI.ashx - # 0单机,1执行和文件传输分开 - fileType: 0 - postName: root - postCode: '&bwM%Tgsn@cw' - postServer: 10.1.3.166 - #后处理执行模式,0本机,1ssh到其他机器 - postType: 0 - #最多同时执行的后处理数量 - postCount: 2 - -idme: - tenantId: 700993435561107456 - # prefixUrl: https://10.30.8.192/rdm_d7cfc15006a04012934fcbb120ef3f18_app/services/ - prefixUrl: https://idme-runtime.gacrnd.com/rdm_9630dbf335434b5aa5a4a5d9f655876c_app/services/ - privateKeyStr: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2Lt/AHP9kPCqQuGxpLEfsE9JmwdNe1DyvWQGC8l4oKOIIBuJRJr2DlVcdfIT1KO49mmP4ucS10OoxGgXclW24BBzvGtQFJ6aF9e7pHq3m/lq6zAVTV8smr23XBe6+n8rDaG0IEtFCnsyizA/idzcKs3KSnSXN9AU0fwI+nAJZ8896liK/A5H/YYnVxvJlgy4/fGdHzgEjzFbi54AqfZTfcFbYA5W0S1h6L4TE/BSVV6cgtL3bpIUQuaLKiPP/E//PwNU7aZ11WaopIkXxB15cZ7JOXHpyHs49sdShIDY+75L8QKykWX7xm/Kg+p2y1HmjpK0sYDZwgc2B3D/myTDlAgMBAAECggEAM5JhVIjg4wcFJaKPTdZzJakWzm/f3eBGrXyMqPzjGos4MP2B42cMDsuftYEiQiQsDNQ/qJEt1ioloXC0aBUE0iqX5je5/RuUUCemUeeVYuZt2KMYftdDctgGR/At/VhOlbJh6v8oras2Un9hn8IPmr/hlw9VPE/viUTK5d5T7BJUqYxiakEVYofnUWeOGvQJCsC8HT32kMsl3U3zCtut5t2v4afV+16yB8CasBYpgWZ9TBbh8FldxngEvHTJwNSIEm0KR2puFDIwctEvHxd8bxbNYMYfQL0KBW6f2GZQ061zoOQzwo4ZAH/foVq2WrUPp9KTzhawG8NqLOjpQHodAQKBgQD+T3VBda3gANhX3Ti5cmR+N9nOlYp9xifkaC0kcrFcFIVTbK/f1OobPmUQkXoGKqI+swc6Z3wvmM/BT8qGCLCQIjhL7oiIGks6ALZYFSO4rTaP16qL37utlnp3exinEhnq0Yb8u9VpVjC/5v7uOdKwWd0ZXjvbMudDc9bHukMxXQKBgQC3ZL0kF7hkHiVDud5Dg0NIY1jCc90ENfzj2J6I23jddodYprjVu1POpEvM1jb3rpmbZOYsCJb5En5QePTgsWq1rliPpD67Etsm5g2glJhPmRGcc/9RDr2AOArNip9U+IhICbhonKaWkJaUoKvD7k6WODJG2kAzPqiyrLkabn3dKQKBgF1T5bEvMa86QCsGmZGdBHo5nuosgRWlSfCNtrtgh+xF76PtCCI5rexvmoFZEhH/RWmDJAzv+2gwSVYlJSrJN5q9pDFhiaOBGshfiIuMvn5AuvxQ5lrMscCDr8/3UdXGU9KUMFjByhENO3jBmh7tA4AKipSLu6W26Z4cfd7wYUZVAoGBAJvfPXstxgUiMh4MHkNXj5o5BjnP7GwlztmBRc2gbGwe0A6jNbpDS4n4zow9Dd8aQWh4K8IFUvxDoaSYCdnoMYBVvOPpf3/VGPtI0RBI++O7f+JwHPMyChKuj0//oEjCLGK+EESp0FVscu/EV/lh1N2Myf66hZKIkS277F/wxX1xAoGBAIleLj+Yl4G/QAj4Cp99rEF7LvClooLsSa1s344xe5F6IWdd3jk5UlUywPeLD+x2aiPKYra/4W7msfAwLhhjaADPHtqp4q7Xm60kWkuTfWZe0hRvcH+lnar1gYksJOa2jaosYTAiUR59VOzGaQqgJ6oVHV4PlE5Cv5xO0Rvg2dQe - userId: PerformancePlanningV - userName: SPDMSystem - -ftp: - host: 172.27.3.135 - port: 6318 - -#hpc定时任务开关 -scheduled: - cleanZip: 0 0 4 * * ? - getProjectSize: 0 0/30 9-19 * * ? - syncHpcTaskStatus: 30 * * * * ? - taskResultSync: 0 0/1 * * * ? - - loadcaseNotice: 0 0 9 * * ? - updateExeStatus: 0 0 4 * * ? - syncUser: 0 0 4 * * ? - approve: - replyUrl: http:192.168.65.161:7102/simulation/task/taskpool/approveHandleNotice \ No newline at end of file + replyUrl: http:192.168.30.146:7102/simulation/task/taskpool/approveHandleNotice +#logging: +# config: ./config/logback.xml + +security: + whitelist: + paths: + - /taskpool/approveHandleNotice + - /taskPerformance/getRunPerformance \ No newline at end of file diff --git a/task/src/main/resources/bin/start.sh b/task/src/main/resources/bin/start.sh index 64a5ade1..1bfccb3f 100644 --- a/task/src/main/resources/bin/start.sh +++ b/task/src/main/resources/bin/start.sh @@ -43,5 +43,5 @@ echo "正在启动项目..." echo "======================================================================" # 启动项目,保留控制台输出 -nohup java ${JVM_OPTS} -Dspring.profiles.active=dev -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5007 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & diff --git a/task/src/main/resources/bin/startprod.sh b/task/src/main/resources/bin/startprod.sh new file mode 100644 index 00000000..1bfccb3f --- /dev/null +++ b/task/src/main/resources/bin/startprod.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# Spring Boot 项目启动脚本 +JAR_PATH="/home/app/task" +JAR_NAME="task-0.0.1-SNAPSHOT.jar" +FULL_JAR_PATH="${JAR_PATH}/${JAR_NAME}" + +# 与logback.xml保持一致的日志路径 +LOG_HOME="/home/app/task/logs" +LOG_FILE="${LOG_HOME}/running.log" + +# JVM参数 +JVM_OPTS="-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}/heapdump.hprof" + +# 检查Jar包是否存在 +check_jar_exists() { + if [ ! -f "${FULL_JAR_PATH}" ]; then + echo "ERROR: Jar包不存在!路径:${FULL_JAR_PATH}" + exit 1 + fi +} + +# 获取运行中的进程PID +get_running_pid() { + ps -ef | grep "${JAR_NAME}" | grep -v "grep" | awk '{print $2}' +} + +# 启动服务 +check_jar_exists + +PID=$(get_running_pid) +if [ -n "${PID}" ]; then + echo "项目已在运行中!PID: ${PID}" + exit 0 +fi + +# 确保日志目录存在 +if [ ! -d "${LOG_HOME}" ]; then + mkdir -p "${LOG_HOME}" + echo "日志目录不存在,已自动创建:${LOG_HOME}" +fi + +echo "正在启动项目..." +echo "======================================================================" + +# 启动项目,保留控制台输出 +nohup java ${JVM_OPTS} -Dspring.profiles.active=prod -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5007 -jar "${FULL_JAR_PATH}" > "${LOG_FILE}" 2>&1 & +