私のSpring BootアプリケーションはWebサーバーではありませんが、カスタムプロトコル(この場合はCamelを使用)を使用するサーバーです。
ただし、Spring Bootは開始後すぐに(正常に)停止します。これを防ぐにはどうすればよいですか?
Ctrl + Cまたはプログラムでアプリを停止したいのですが。
@CompileStatic
@Configuration
class CamelConfig {
@Bean
CamelContextFactoryBean camelContext() {
final camelContextFactory = new CamelContextFactoryBean()
camelContextFactory.id = 'camelContext'
camelContextFactory
}
}
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を使用して、一貫性のために依存関係管理情報をインポートします。
_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()
}
}
_
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>
Spring Bootは、アプリケーションを実行するタスクを、アプリケーションが実装されているプロトコルに任せます。たとえば、これを参照してください ガイド :
また、メインスレッドを維持するために
CountDownLatch
のようないくつかのハウスキーピングオブジェクトが必要です...
そのため、たとえば、Camelサービスを実行する方法は、CamelをメインのSpring Bootアプリケーションクラスから スタンドアロンアプリケーション として実行することです。
これは、さらに簡単になりました。
camel.springboot.main-run-controller=true
をapplication.propertiesに追加するだけです
すべてのスレッドが完了し、プログラムは自動的に閉じます。したがって、@Scheduled
で空のタスクを登録すると、シャットダウンを防ぐためのループスレッドが作成されます。