it-swarm.com.de

Wie kann verhindert werden, dass Spring Boot Daemon/Server-Anwendung sofort geschlossen/heruntergefahren wird?

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
    }

}
16
Hendy Irawan

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.

13
jmkgreen

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()
    }
}
23
Hendy Irawan

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>
7
Willy du Preez

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.

4
Anatoly

Dies wird jetzt noch einfacher.

Einfach hinzufügen camel.springboot.main-run-controller=true zu Ihren application.properties

1
Venkat

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.

0
izee

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();
        };
    }
0
Cheng