web-dev-qa-db-ja.com

Spring Bootデーモン/サーバーアプリケーションがすぐに終了/シャットダウンするのを防ぐ方法は?

私のSpring BootアプリケーションはWebサーバーではありませんが、カスタムプロトコル(この場合はCamelを使用)を使用するサーバーです。

ただし、Spring Bootは開始後すぐに(正常に)停止します。これを防ぐにはどうすればよいですか?

Ctrl + Cまたはプログラムでアプリを停止したいのですが。

@CompileStatic
@Configuration
class CamelConfig {

    @Bean
    CamelContextFactoryBean camelContext() {
        final camelContextFactory = new CamelContextFactoryBean()
        camelContextFactory.id = 'camelContext'
        camelContextFactory
    }

}
22
Hendy Irawan

Apache Camel 2.17現在、より明確な答えがあります。引用するには http://camel.Apache.org/spring-boot.html

メインスレッドをブロックしてCamelが稼働し続けるようにするには、spring-boot-starter-web依存関係を含めるか、camel.springboot.main-run-controller = trueをapplication.propertiesまたはapplication.ymlファイルに追加します。

次の依存関係も必要になります。

<dependency> <groupId>org.Apache.camel</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>2.17.0</version> </dependency>

<version>2.17.0</version>またはラクダBOMを使用して、一貫性のために依存関係管理情報をインポートします。

16
jmkgreen

_org.springframework.boot.CommandLineRunner_ + Thread.currentThread().join()を使用して解決策を見つけました。例:(注:以下のコードはJavaではなくGroovyにあります)

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

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

アプリケーションを停止するには、プロセスIDを検索し、コンソールからkillコマンドを発行できます。

kill <PID>
7
Willy du Preez

Spring Bootは、アプリケーションを実行するタスクを、アプリケーションが実装されているプロトコルに任せます。たとえば、これを参照してください ガイド

また、メインスレッドを維持するためにCountDownLatchのようないくつかのハウスキーピングオブジェクトが必要です...

そのため、たとえば、Camelサービスを実行する方法は、CamelをメインのSpring Bootアプリケーションクラスから スタンドアロンアプリケーション として実行することです。

4
Anatoly

これは、さらに簡単になりました。

camel.springboot.main-run-controller=trueをapplication.propertiesに追加するだけです

1
Venkat

すべてのスレッドが完了し、プログラムは自動的に閉じます。したがって、@Scheduledで空のタスクを登録すると、シャットダウンを防ぐためのループスレッドが作成されます。

0
izee