This is an automated email from the ASF dual-hosted git repository.

yasith pushed a commit to branch feat/single-jvm
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/feat/single-jvm by this push:
     new c7d5f25b2d feat: start background services from AiravataServer 
bootstrap
c7d5f25b2d is described below

commit c7d5f25b2d4be72f95490b95a569d3f42f41da56
Author: yasithdev <[email protected]>
AuthorDate: Thu Mar 26 02:15:36 2026 -0500

    feat: start background services from AiravataServer bootstrap
    
    AiravataServer.start() now launches all services in sequence:
    1. Database initialization (all catalogs)
    2. Thrift handlers (in-process)
    3. TMultiplexedProcessor (9 services on port 8930)
    4. Background services (each with independent lifecycle):
       - db_event_manager (async DB event processing)
       - monitoring_server (Prometheus metrics on configurable port)
       - cluster_status_monitor (if enabled)
       - data_interpreter (if enabled)
       - process_rescheduler (if enabled)
    
    Each background service starts independently — failure in one
    does not affect others or the Thrift server.
---
 .../apache/airavata/api/server/AiravataServer.java | 79 ++++++++++++++++++++++
 1 file changed, 79 insertions(+)

diff --git 
a/airavata-api/src/main/java/org/apache/airavata/api/server/AiravataServer.java 
b/airavata-api/src/main/java/org/apache/airavata/api/server/AiravataServer.java
index e0106d7ccb..69dbc9cb71 100644
--- 
a/airavata-api/src/main/java/org/apache/airavata/api/server/AiravataServer.java
+++ 
b/airavata-api/src/main/java/org/apache/airavata/api/server/AiravataServer.java
@@ -20,8 +20,14 @@
 package org.apache.airavata.api.server;
 
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import 
org.apache.airavata.compute.resource.monitoring.ComputationalResourceMonitoringService;
+import org.apache.airavata.db.event.manager.DBEventManagerRunner;
+import 
org.apache.airavata.metascheduler.metadata.analyzer.DataInterpreterService;
+import 
org.apache.airavata.metascheduler.process.scheduling.engine.rescheduler.ProcessReschedulingService;
+import org.apache.airavata.patform.monitoring.MonitoringServer;
 import org.apache.airavata.api.Airavata;
 import org.apache.airavata.api.server.handler.AiravataServerHandler;
 import org.apache.airavata.api.server.util.Constants;
@@ -90,6 +96,7 @@ public class AiravataServer implements IServer {
 
     private ServerStatus status;
     private TServer server;
+    private final List<IServer> backgroundServices = new ArrayList<>();
 
     private final List<DBInitConfig> dbInitConfigs = Arrays.asList(
             new ExpCatalogDBInitConfig(),
@@ -205,6 +212,7 @@ public class AiravataServer implements IServer {
                             logger.info("Airavata Server started on port {}", 
serverPort);
                             logger.info("Registered services: Airavata, 
RegistryService, SharingRegistry, "
                                     + "CredentialStore, UserProfile, 
TenantProfile, IamAdminServices, GroupManager");
+                            startBackgroundServices();
                         }
                     })
                     .start();
@@ -216,12 +224,83 @@ public class AiravataServer implements IServer {
         }
     }
 
+    /**
+     * Starts background services after the Thrift server is ready.
+     * Each service has an independent lifecycle — failures are non-fatal
+     * and do not affect other services.
+     */
+    private void startBackgroundServices() {
+        logger.info("Starting background services...");
+
+        // DB Event Manager — processes async DB events
+        registerAndStart(new DBEventManagerRunner(), "db_event_manager");
+
+        // Monitoring Server — Prometheus metrics endpoint
+        try {
+            if 
(ServerSettings.getBooleanSetting("api.server.monitoring.enabled")) {
+                String monHost = 
ServerSettings.getSetting("api.server.monitoring.host", "localhost");
+                int monPort = 
Integer.parseInt(ServerSettings.getSetting("api.server.monitoring.port", 
"9097"));
+                MonitoringServer monitoringServer = new 
MonitoringServer(monHost, monPort);
+                monitoringServer.start();
+                logger.info("  monitoring_server: started on {}:{}", monHost, 
monPort);
+            }
+        } catch (Exception e) {
+            logger.warn("  monitoring_server: failed — {}", e.getMessage());
+        }
+
+        // Cluster status monitoring — polls compute resource queue status
+        try {
+            if (ServerSettings.enableClusterStatusMonitoring()) {
+                registerAndStart(new ComputationalResourceMonitoringService(), 
"cluster_status_monitor");
+            }
+        } catch (Exception e) {
+            logger.warn("  cluster_status_monitor: config error — {}", 
e.getMessage());
+        }
+
+        // Data interpreter — metadata analysis for submitted jobs
+        try {
+            if (ServerSettings.enableDataAnalyzerJobScanning()) {
+                registerAndStart(new DataInterpreterService(), 
"data_interpreter");
+            }
+        } catch (Exception e) {
+            logger.warn("  data_interpreter: config error — {}", 
e.getMessage());
+        }
+
+        // Process rescheduler — retries/reschedules failed processes
+        try {
+            if (ServerSettings.enableMetaschedulerJobScanning()) {
+                registerAndStart(new ProcessReschedulingService(), 
"process_rescheduler");
+            }
+        } catch (Exception e) {
+            logger.warn("  process_rescheduler: config error — {}", 
e.getMessage());
+        }
+
+        logger.info("Background services initialization complete ({} 
running)", backgroundServices.size());
+    }
+
+    private void registerAndStart(IServer service, String label) {
+        try {
+            service.start();
+            backgroundServices.add(service);
+            logger.info("  {}: started", label);
+        } catch (Exception e) {
+            logger.warn("  {}: failed — {}", label, e.getMessage());
+        }
+    }
+
     @Override
     public void stop() throws Exception {
         if (server != null && server.isServing()) {
             setStatus(ServerStatus.STOPING);
             server.stop();
         }
+        for (IServer service : backgroundServices) {
+            try {
+                service.stop();
+            } catch (Exception e) {
+                logger.warn("Error stopping {}: {}", service.getName(), 
e.getMessage());
+            }
+        }
     }
 
     @Override

Reply via email to