(sys) Add springboard service that can spawn multiple different marginalia services to make distribution easier.

This commit is contained in:
Viktor Lofgren 2024-04-16 13:25:15 +02:00
parent 8c559c8121
commit d2658d6f84
3 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,33 @@
plugins {
id 'java'
id 'application'
id 'jvm-test-suite'
}
application {
mainClass = 'nu.marginalia.SingleService'
applicationName = 'marginalia'
}
tasks.distZip.enabled = false
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(22))
}
}
apply from: "$rootProject.projectDir/srcsets.gradle"
dependencies {
implementation project(':code:services-core:query-service')
implementation project(':code:services-core:index-service')
implementation project(':code:services-core:control-service')
implementation project(':code:services-core:executor-service')
testImplementation libs.bundles.slf4j.test
testImplementation libs.bundles.junit
testImplementation libs.mockito
}

View File

@ -0,0 +1,49 @@
package nu.marginalia;
public class SingleService {
enum Service {
IndexService("index", "nu.marginalia.index.IndexMain"),
ControlService("control", "nu.marginalia.control.ControlMain"),
ExecutorService("executor", "nu.marginalia.executor.ExecutorMain"),
QueryService("query", "nu.marginalia.query.QueryMain"),
;
public final String name;
public final String className;
Service(String name, String className) {
this.name = name;
this.className = className;
}
/** Call the main method of the service class */
public void run(String[] args) {
try {
// Use reflection to call the main method of the service class to avoid
// loading all classes at startup time, which would invoke a bunch of contradictory
// static initializers
Class<?> clazz = Class.forName(className);
clazz.getMethod("main", String[].class).invoke(null, (Object) args);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String... args) {
if (args.length == 0) {
System.out.println("Usage: SingleService <service> [args...]");
}
String serviceName = args[0];
String[] serviceArgs = new String[args.length - 1];
System.arraycopy(args, 1, serviceArgs, 0, serviceArgs.length);
for (var service : Service.values()) {
if (service.name.equals(serviceName)) {
service.run(serviceArgs);
}
}
}
}

View File

@ -5,6 +5,7 @@ include 'code:services-core:assistant-service'
include 'code:services-core:control-service'
include 'code:services-core:query-service'
include 'code:services-core:executor-service'
include 'code:services-core:single-service-runner'
include 'code:services-application:search-service'
include 'code:services-application:api-service'