コマンド・モードの導入

Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろです。

この記事は、Quarkus.io のブログ記事、Introducing Command Mode の翻訳記事です。

コマンドラインアプリケーションからQuarkusの素晴らしいAPIとフル機能セットを使いたいと思ったことはありませんか?

時々スケジュールされたバッチジョブを実行する必要があり、それをQuarkusが構築したメインのサービスに埋め込みたくなかったのでしょうか?

https://i.imgflip.com/3xwzsh.jpg

Quarkusはこれまでのところ、エンドポイントを介して実行されるアプリケーションを記述するために使用されています。これは、すなわち、HTTPを介して長く実行されるウェブサーバーや、サーバーレス環境で使われる短命な関数です。

Quarkus 1.4のコマンドモードでは、エンドポイントなしで実行し、オプションですぐに終了するアプリを書けます。

これにより、Quarkusを使用して、コマンドラインクライアント(CLI)、バッチスクリプト、コンソールアプリなど、まったく新しいスタイルのアプリケーションを書けます。

使用方法

以下は、すべてのクイックスタートの伝統的な GreetingService を使用したシンプルな GreetingMain クラスです。

import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.annotations.QuarkusMain;

@QuarkusMainpublic class GreetingMain implements QuarkusApplication {
  @Inject ②
  GreetingService service;

  @Override
  public int run(String... args) throws Exception {   ③

    if (args.length>0) {
      System.out.println(service.greeting(arg[0]));
    } else {
      System.out.println(service.greeting(""));
    }

    return 0;
 }
}

①QuarkusMainアノテーションは、これがメインのエントリーポイントであることをQuarkusに伝えます。

②Quarkusが起動するとrunメソッドが一度呼び出され、終了するとアプリケーションが停止します。リクエストスコープされた Bean にアクセスしたい場合は、run メソッドに @ActivateRequestContext をアノテーションできます。これは、Hibernate Panache Entity beansのクエリメソッドなどを使用して、既存のビジネスロジックを書いたり、再利用したりするのに便利です。

これをGreetingMain.javaに追加して、.jarファイルまたは完全なネイティブ(mvnwパッケージ-Dnativeを使用)にコンパイルできます。

 ./target/getting-started-command-mode-1.0-SNAPSHOT-runner commando
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2020-04-25 00:14:38,999 INFO  [io.quarkus] (main) getting-started-command-mode 1.0-SNAPSHOT (powered by Quarkus 999-SNAPSHOT) started in 0.005s.
2020-04-25 00:14:38,999 INFO  [io.quarkus] (main) Profile prod activated.
2020-04-25 00:14:38,999 INFO  [io.quarkus] (main) Installed features: [cdi]
hello commando
2020-04-25 00:14:38,999 INFO  [io.quarkus] (main) getting-started-command-mode stopped in 0.000s

クリーンな出力

CLIで作業する場合、デフォルトのコンソールログ出力は冗長なものになります。今のところ一番良い方法は、以下のプロパティを設定することでオフにします。

quarkus.log.level=SEVERE
quarkus.hibernate-orm.log.sql=false
quarkus.banner.enabled=false

これらは、%cli.接頭辞を追加することで、cli と呼ばれるカスタム・プロファイルで設定できます。

これにはいくつかの問題があります。可能な解決策は課題 #8871で議論されています。

開発モード

コマンドモードは quarkus:dev 別名 dev モードで動作します。

mvn quarkus:devで実行する場合、コマンドラインに渡したい引数として-Dquarkus.args=任意の値 を追加できます。

quarkusargsはホワイトスペースで分割され、エスケープされた引用符を受け入れます。このように、mvn quarkus:dev -Dquarkus.args="foo bar \"baz qux\""とすると、アプリは開始し以下のように終了します。

foo
bar
baz qux
Quarkus application exited with code 0
Press Enter to restart or Ctrl + C to quit

Enterを複数回押して強制的に再実行できます。ソースコードを編集した場合は、Enterを押すとビルドが開始され、実際のオーバーヘッドなしで再起動されます。

mainメソッド

QuarkusMain アノテーションクラスを介してコマンドモードを追加する一環として、独自のstatic void main() メソッドを持てます。以下のコードの断片は、main メソッドからQuarkusを実行するための最低限のものです。

static void main(String ...args) {
    Quarkus.run(args);
}

上記の@QuarksMainクラスで使用するには、以下のようになります。

static void main(String ...args) {
    Quarkus.run(GreetingMain.class, args);
}

以上です。これは、Quarkusアプリの起動/停止をカスタマイズするのではなく、多くの人が求めていたのは、IDEから直接Quarkusアプリを起動/デバッグする機能です。

これらのクラスの完全な動作例は、コマンドモードのクイックスタートで見られます。

最小限のCLIアプリ

CLI アプリがまだエンドポイントを提供していることは注目に値します - 実際、先ほど作ったようなデフォルトアプリは、REST エンドポイントはまだ起動して実行しています。気づかないだけです。Quarkus はそれほど速いのです。

本当に最小限の拡張が欲しい場合は、pom.xmlの中のquarkus-resteasy拡張を削除して、代わりにarcを入れます。

そうすると、あなたのQuarkusメインクラス以外は何も実行されません。

次は何をするの?

私たちに教えてください!あなたはQuarkusのコマンドアプリを使って何をしたいですか?

今のところはCLIを書くことを楽しんでいますが、他にどれだけの人が参加してくれますか!?

https://github.com/quarkusio/quarkus/issues でご意見をお聞かせください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。