From 95be60dd2ed59a9a52ce4026ed7d87e45c3086e8 Mon Sep 17 00:00:00 2001 From: devmrko Date: Mon, 29 Jun 2026 17:18:21 +0900 Subject: [PATCH] fix #558: stabilize deployment and role rendering --- scripts/deploy-backoffice-vm.sh | 2 +- .../service/OrdsMetadataService.java | 27 +++++++++++++++---- src/main/resources/templates/roles.html | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/scripts/deploy-backoffice-vm.sh b/scripts/deploy-backoffice-vm.sh index 02ebc5c..5fc2451 100755 --- a/scripts/deploy-backoffice-vm.sh +++ b/scripts/deploy-backoffice-vm.sh @@ -174,7 +174,7 @@ if [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" >/dev/null 2>&1; then exit 0 fi -nohup java -jar "$APP_DIR/app.jar" > "$LOG_FILE" 2>&1 & +setsid nohup java -jar "$APP_DIR/app.jar" > "$LOG_FILE" 2>&1 < /dev/null & echo $! > "$PID_FILE" echo "started pid=$(cat "$PID_FILE") log=$LOG_FILE" START diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java index c3eb51b..883a2e5 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java @@ -14,6 +14,8 @@ import java.util.Locale; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; public class OrdsMetadataService { private static final String VECTOR_SEARCH_OBJECT = "CB_VECTOR_SEARCH_DOCUMENTS"; + private static final Logger log = LoggerFactory.getLogger(OrdsMetadataService.class); private final OrdsMetadataMapper mapper; private final JdbcTemplate jdbcTemplate; @@ -40,6 +43,8 @@ public class OrdsMetadataService { this.mapper = mapper; this.jdbcTemplate = jdbcTemplate; this.protectedObjectService = protectedObjectService; + HikariDataSource metadataDataSource = null; + JdbcTemplate metadataJdbcTemplate = new JdbcTemplate(dataSource); if (hasText(ordsMetadataUrl) && hasText(ordsMetadataUsername)) { HikariConfig config = new HikariConfig(); config.setPoolName("vpd-ords-metadata-pool"); @@ -50,12 +55,24 @@ public class OrdsMetadataService { config.setMaximumPoolSize(2); config.setMinimumIdle(0); config.setConnectionTimeout(10000); - this.ordsMetadataDataSource = new HikariDataSource(config); - this.ordsMetadataJdbcTemplate = new JdbcTemplate(this.ordsMetadataDataSource); - } else { - this.ordsMetadataDataSource = null; - this.ordsMetadataJdbcTemplate = new JdbcTemplate(dataSource); + // ORDS metadata is an optional administrative connection. Do not fail + // the whole backoffice startup when the remote TNS host is temporarily + // unavailable; Handler create/update will report the connection error + // at the point of use instead. + config.setInitializationFailTimeout(-1); + try { + metadataDataSource = new HikariDataSource(config); + metadataJdbcTemplate = new JdbcTemplate(metadataDataSource); + } catch (RuntimeException exception) { + log.warn("ORDS metadata DB is unavailable; using the main DB for read-only fallback: {}", + exception.getMessage()); + if (metadataDataSource != null) { + metadataDataSource.close(); + } + } } + this.ordsMetadataDataSource = metadataDataSource; + this.ordsMetadataJdbcTemplate = metadataJdbcTemplate; } public List findHandlers() { diff --git a/src/main/resources/templates/roles.html b/src/main/resources/templates/roles.html index 45735c0..3d37e31 100644 --- a/src/main/resources/templates/roles.html +++ b/src/main/resources/templates/roles.html @@ -58,7 +58,7 @@ 10 HR_DEPT_ROLE - PUBLIC