このマニュアルは現在作成中であり、不完全です。
改善にご協力いただければ幸いです。READMEをご覧ください。

4 起動

この章では、Ratpackアプリケーションの起動方法について説明し、Ratpack APIのエントリポイントを詳細に説明します。

1.4 RatpackServer

RatpackServer型は、Ratpackのエントリポイントです。このAPIを使用してアプリケーションを起動する独自のメインクラスを作成します。

package my.app;

import ratpack.core.server.RatpackServer;
import ratpack.core.server.ServerConfig;
import java.net.URI;

public class Main {
  public static void main(String... args) throws Exception {
    RatpackServer.start(server -> server
      .serverConfig(ServerConfig.embedded().publicAddress(new URI("http://company.org")))
      .registryOf(registry -> registry.add("World!"))
      .handlers(chain -> chain
        .get(ctx -> ctx.render("Hello " + ctx.get(String.class)))
        .get(":name", ctx -> ctx.render("Hello " + ctx.getPathTokens().get("name") + "!"))     
      )
    );
  }
}

アプリケーションは、このインターフェースのof()またはstart()静的メソッドに渡される関数として定義されます。この関数はRatpackServerSpecを受け取り、これを使用してRatpackアプリケーションの3つの基本的な側面(つまり、サーバ設定、ベースレジストリ、ルートハンドラ)を指定できます。

このマニュアルとAPIリファレンスのほとんどの例では、アプリケーションの作成にRatpackServerの代わりにEmbeddedAppを使用しています。これは、例の「テスト」の性質によるものです。コードサンプルの詳細については、このセクションを参照してください。

1.1.4 サーバ設定

ServerConfigは、サーバを起動するために必要な設定を定義します。ServerConfigの静的メソッドを使用してインスタンスを作成できます。

1.1.1.4 ベースディレクトリ

サーバ設定の重要な側面は、ベースディレクトリです。ベースディレクトリは、アプリケーションのファイルシステムのルートであり、ポータブルなファイルシステムを提供します。実行時にファイルに解決されるすべての相対パスは、ベースディレクトリを基準に解決されます。静的アセット(画像、スクリプトなど)は、通常、相対パスを使用してベースディレクトリを介して提供されます。

baseDir(Path)メソッドを使用すると、ベースディレクトリを既知の場所に設定できます。必要に応じて、環境間で移植性を確保するために、このメソッドを呼び出すコードは、特定のランタイムのベースディレクトリを決定する責任を負います。

BaseDir.find()を使用すると、クラスパス上のベースディレクトリを検出し、環境間での移植性を向上させることができます。このメソッドは、クラスパス上のパス"/.ratpack"のリソースを検索します。

/.ratpackデフォルトとは異なるパスを使用するには、BaseDir.find(String)メソッドを使用します。

マーカーファイルの内容は完全に無視されます。これは、囲んでいるディレクトリ(ベースディレクトリとして使用される)を見つけるためにのみ使用されます。このファイルは、クラスパス上のJAR内、またはクラスパス上のディレクトリ内にある可能性があります。

次の例は、BaseDir.find()を使用してクラスパスからベースディレクトリを検出する方法を示しています。

import ratpack.core.server.ServerConfig;
import ratpack.test.embed.EphemeralBaseDir;
import ratpack.test.embed.EmbeddedApp;

import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Path;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Example {
  public static void main(String... args) throws Exception {
    EphemeralBaseDir.tmpDir().use(baseDir -> {
      baseDir.write("mydir/.ratpack", "");
      baseDir.write("mydir/assets/message.txt", "Hello Ratpack!");
      Path mydir = baseDir.getRoot().resolve("mydir");

      ClassLoader classLoader = new URLClassLoader(new URL[]{mydir.toUri().toURL()});
      Thread.currentThread().setContextClassLoader(classLoader);

      EmbeddedApp.of(serverSpec -> serverSpec
        .serverConfig(c -> c.baseDir(mydir))
        .handlers(chain ->
          chain.files(f -> f.dir("assets"))
        )
      ).test(httpClient -> {
        String message = httpClient.getText("message.txt");
        assertEquals("Hello Ratpack!", message);
      });
    });
  }
}

EphemeralBaseDirの使用と新しいコンテキストクラスローダの構築は、上記の例では、例を自己完結にするためだけに使用されています。実際のメインメソッドは、BaseDir.find()を呼び出すだけで、適切なクラスパスを使用してRatpackアプリケーションJVMを起動したものが何であれ、それに依存します。

Ratpackは、Java 7のPathAPIを介してベースディレクトリにアクセスし、JARの内容をファイルシステムとして透過的に使用できます。

2.1.1.4 ポート

port(int)メソッドを使用すると、サーバに接続するために使用されるポートを設定できます。設定されていない場合、デフォルト値は5050です。

3.1.1.4 SSL

デフォルトでは、Ratpackサーバは設定されたポートでHTTPトラフィックをリッスンします。HTTPSトラフィックを有効にするには、ssl(SslContext)メソッドを使用してSSL証明書とキーを指定します。

v2.0以降、Ratpackは、サーバ名インジケータ(SNI)を使用して要求されたホストに基づいてSSL設定を選択することもサポートしています。ssl(SslContext, Action)を使用して、デフォルトのSSL設定と、代替SSL設定を持つ追加のドメインマッピングを指定します。マッピングで指定されたドメインはDNSワイルドカードをサポートし、ドメイン階層で最大1レベルまで一致する(例:*.ratpack.ioapi.ratpack.ioに一致しますが、docs.api.ratpack.ioには一致しません)。

システムプロパティまたは環境変数を介してSSL設定を構成するには、ドメイン名を指定するための特別な処理が必要です。次の表は、デフォルトのSSL設定とサブドメインの設定を指定する方法を示しています。

| システムプロパティ | 環境変数 | 説明 | |————————————————|————————————————–|———————————————————————————| | ratpack.server.ssl.keystoreFile | RATPACK_SERVER__SSL__KEYSTORE_FILE | サーバ証明書と秘密鍵を含むJKSへのパスを指定します | | ratpack.server.ssl.keystorePassword | RATPACK_SERVER__SSL__KEYSTORE_PASSWORD | キーストアJKSのパスワードを指定します | | ratpack.server.ssl.truststoreFile | RATPACK_SERVER__SSL__TRUSTSTORE_FILE | 信頼できる証明書を含むJKSへのパスを指定します | | ratpack.server.ssl.truststorePassword | RATPACK_SERVER__SSL__TRUSTSTORE_PASSWORD | トラストストアJKSのパスワードを指定します | | ratpack.server.ssl.ratpack_io.keystoreFile | RATPACK_SERVER__SSL__RATPACK_IO__KEYSTORE_FILE | ドメインratpack.ioのキーストアへのパスを指定します | | ratpack.server.ssl.*_ratpack_io.kyestoreFile | RATPACK_SERVER__SSL___RATPACK_IO_KEYSTORE_FILE | ドメイン*.ratpack.ioのキーストアへのパスを指定します |

次の特別なルールに注意してください。1. システムプロパティと環境変数の両方で、ドメイン名セパレータ(.)はアンダースコア(_)に変換されます。2. 環境変数では、ドメインワイルドカード文字(*)はアンダースコア(_)で指定されます。これにより、ドメイン名の前に3つのアンダースコア(___RATPACK_IO)が付きます。

2.1.4 レジストリ

registryは、型別に格納されたオブジェクトのストアです。アプリケーション内に多くの異なるレジストリが存在する可能性がありますが、すべてのアプリケーションは「サーバレジストリ」によってバックアップされています。サーバレジストリとは、アプリケーションをバックアップするレジストリに付けられた名前であり、起動時に定義されます。

3.1.4 ハンドラ

サーバハンドラは、すべての受信HTTPリクエストを受け取ります。ハンドラは合成可能であり、実際には1つのハンドラだけで構成されているアプリケーションはほとんどありません。ほとんどのアプリケーションのサーバハンドラは合成ハンドラであり、通常はhandlers(Action)メソッドを使用してChainDSLを使用して作成されます。

4.1.4 起動と停止アクション

Serviceインターフェースを使用すると、アプリケーションライフサイクルにフックできます。リクエストを受け入れる前に、Ratpackはすべてのサービスに通知し、初期化を実行できるようにします。逆に、アプリケーションが停止すると、Ratpackはすべてのサービスに通知し、クリーンアップまたは終了を実行できるようにします。