Meine Spring Boot-Anwendung ist kein Webserver, sondern ein Server, der ein benutzerdefiniertes Protokoll verwendet (in diesem Fall Camel).
Spring Boot wird jedoch sofort gestoppt. Wie kann ich das verhindern?
Ich möchte, dass die App bei Strg + C oder programmgesteuert angehalten wird.
@CompileStatic
@Configuration
class CamelConfig {
@Bean
CamelContextFactoryBean camelContext() {
final camelContextFactory = new CamelContextFactoryBean()
camelContextFactory.id = 'camelContext'
camelContextFactory
}
}
Ab Apache Camel 2.17 gibt es eine klarere Antwort. Zu zitieren http://camel.Apache.org/spring-boot.html :
Um den Haupt-Thread blockiert zu halten, damit Camel aktiv bleibt, fügen Sie entweder die Spring-Boot-Starter-Web-Abhängigkeit hinzu oder fügen Sie camel.springboot.main-run-controller = true zur Datei application.properties oder application.yml hinzu.
Sie möchten auch die folgende Abhängigkeit:
<dependency>
<groupId>org.Apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>2.17.0</version>
</dependency>
Ersetzen Sie eindeutig <version>2.17.0</version>
oder verwenden Sie die Kamel-Stückliste, um Informationen zur Abhängigkeitsverwaltung für Konsistenz zu importieren.
Ich habe die Lösung gefunden, die org.springframework.boot.CommandLineRunner
+ Thread.currentThread().join()
verwendet, z.
package id.ac.itb.Lumen.social
import org.slf4j.LoggerFactory
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
class LumenSocialApplication implements CommandLineRunner {
private static final log = LoggerFactory.getLogger(LumenSocialApplication.class)
static void main(String[] args) {
SpringApplication.run LumenSocialApplication, args
}
@Override
void run(String... args) throws Exception {
log.info('Joining thread, you can press Ctrl+C to shutdown application')
Thread.currentThread().join()
}
}
Eine Beispielimplementierung mit CountDownLatch:
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String... args) throws InterruptedException {
ApplicationContext ctx = SpringApplication.run(MyApp.class, args);
final CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
closeLatch.countDown();
}
});
closeLatch.await();
}
Um Ihre Anwendung zu stoppen, können Sie die Prozess-ID nachschlagen und einen Kill-Befehl von der Konsole aus ausführen:
kill <PID>
Spring Boot überlässt die Ausführung der Anwendung dem Protokoll, um das die Anwendung implementiert ist. Siehe zum Beispiel diese Anleitung :
Außerdem sind einige Housekeeping-Objekte wie
CountDownLatch
erforderlich, um den Haupt-Thread am Leben zu erhalten ...
Die Ausführung eines Camel-Dienstes wäre beispielsweise, Camel als Standalone-Anwendung von Ihrer Haupt-Spring-Boot-Anwendungsklasse aus auszuführen.
Dies wird jetzt noch einfacher.
Einfach hinzufügen camel.springboot.main-run-controller=true
zu Ihren application.properties
Alle Threads sind abgeschlossen, das Programm wird automatisch geschlossen. __ Registrieren Sie eine leere Task mit @Scheduled
, um einen Loop-Thread zu erstellen, der das Herunterfahren verhindert.
Mein Projekt ist NON WEB Spring Boot . Meine elegante Lösung ist das Erstellen eines Daemon-Threads von CommandLineRunner .
@Bean
public CommandLineRunner deQueue() {
return args -> {
Thread daemonThread;
consumer.connect(3);
daemonThread = new Thread(() -> {`enter code here`
try {
consumer.work();
} catch (InterruptedException e) {
logger.info("daemon thread is interrupted", e);
}
});
daemonThread.setDaemon(true);
daemonThread.start();
};
}