Eclipse Vert.x 4.1 移行ガイド
ガイド
概要
前書き
本ガイドでは、Eclipse Vert.x 4 リリースの更新を説明します。この情報を使用して Eclipse Vert.x 3.x アプリケーションを Eclipse Vert.x 4 にアップグレードします。本リリースでは、新機能、非推奨、およびサポート対象外になった機能に関する情報を提供します。
アプリケーションで使用されるモジュールに応じて、関連セクションを読み取り、Eclipse Vert.x 4 の変更の詳細を確認できます。
Red Hat ドキュメントへのフィードバック (英語のみ)
弊社のドキュメントに関するご意見やご感想をお寄せください。フィードバックをお寄せいただくには、ドキュメントのテキストを強調表示し、コメントを追加できます。
本セクションでは、フィードバックの送信方法を説明します。
前提条件
- Red Hat カスタマーポータルにログインしている。
- Red Hat カスタマーポータルで、マルチページ HTML 形式でドキュメントを表示します。
手順
フィードバックを提供するには、以下の手順を実施します。
ドキュメントの右上隅にある フィードバック ボタンをクリックして、既存のフィードバックを確認します。
注記フィードバック機能は、マルチページ HTML 形式でのみ有効です。
- フィードバックを提供するドキュメントのセクションを強調表示します。
ハイライトされたテキスト近くに表示される Add Feedback ポップアップをクリックします。
ページの右側のフィードバックセクションにテキストボックスが表示されます。
テキストボックスにフィードバックを入力し、Submit をクリックします。
ドキュメントに関する問題が作成されます。
- 問題を表示するには、フィードバックビューで問題トラッカーリンクをクリックします。
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、弊社 の CTO、Chris Wright のメッセージ を参照してください。
第1章 Eclipse Vert.x を使用するためのアプリケーションの設定
Eclipse Vert.x を使用するようにアプリケーションを設定する場合は、アプリケーションのルートディレクトリーにある pom.xml ファイルの Eclipse Vert.
x BOM(Bill of Materials)アーティファクトを参照する必要があります。BOM は、アーティファクトの正しいバージョンを設定するために使用されます。
要件
- Maven ベースのアプリケーション
手順
Pom
.xml
ファイルを開き、io.vertx:vertx-dependencies
アーティファクトを<dependencyManagement>
セクションに追加します。Type をpom
として指定し、
scope
をimport
として指定します。<project> ... <dependencyManagement> <dependencies> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-dependencies</artifactId> <version>${vertx.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ... </project>
以下のプロパティーを追加して、使用している Eclipse Vert.x および Eclipse Vert.x Maven Plugin のバージョンを追跡します。
プロパティーを使用して、リリースごとに変更する値を設定できます。たとえば、product または plugins のバージョンなどです。
<project> ... <properties> <vertx.version>${vertx.version}</vertx.version> <vertx-maven-plugin.version>${vertx-maven-plugin.version}</vertx-maven-plugin.version> </properties> ... </project>
アプリケーションのパッケージ化に使用されるプラグインとして
vertx-maven-plugin
を指定します。<project> ... <build> <plugins> ... <plugin> <groupId>io.reactiverse</groupId> <artifactId>vertx-maven-plugin</artifactId> <version>${vertx-maven-plugin.version}</version> <executions> <execution> <id>vmp</id> <goals> <goal>initialize</goal> <goal>package</goal> </goals> </execution> </executions> <configuration> <redeploy>true</redeploy> </configuration> </plugin> ... </plugins> </build> ... </project>
Repositories
およびpluginRepositories
を追加して、アプリケーションのビルド用のアーティファクトおよびプラグインが含まれるリポジトリーを指定します。<project> ... <repositories> <repository> <id>redhat-ga</id> <name>Red Hat GA Repository</name> <url>https://maven.repository.redhat.com/ga/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>redhat-ga</id> <name>Red Hat GA Repository</name> <url>https://maven.repository.redhat.com/ga/</url> </pluginRepository> </pluginRepositories> ... </project>
関連情報
- Eclipse Vert.x アプリケーションのパッケージ化に関する詳細は、Vert.x Maven Plugin のドキュメントを参照してください。
第2章 Eclipse Vert.x について
Eclipse Vert.x は、Java 仮想マシンで実行されるリアクティブで非ブロッキングの非同期アプリケーションを作成するために使用されるツールキットです。(JVM).これには、リアクティブアプリケーションの作成に役立つ複数のコンポーネントが含まれています。これは、cloud-native として設計されています。
Eclipse Vert.x は非同期アプリケーションをサポートするため、大量のメッセージ、大規模なイベント処理、HTTP の対話などを持つアプリケーションを作成するために使用できます。
第3章 Eclipse Vert.x 4 で変更された内容
本セクションでは、Eclipse Vert.x 4 リリースと 3.x リリースの基本的な相違点を説明します。
3.1. 非同期操作に future メソッドを使用
Eclipse Vert.x 4 は、非同期操作に future を使用します。すべての callback メソッドには、対応する future メソッドがあります。Future は非同期操作の作成に使用できます。Callback と future メソッドの組み合わせを使用して、callback ベースのアプリケーションを Eclipse Vert.x 4 に移行できます。ただし、非同期操作の callback を引き続き使用することもできます。
以下の例は、Eclipse Vert.x 3.x リリースでコールバックが非同期操作に使用される方法を示しています。
WebClient client = WebClient.create(vertx); HttpRequest request = client.get("/resource"); request.send(ar -> { if (ar.succeeded()) { HttpResponse response = ar.result(); } else { Throwable error = ar.cause(); } });
以下の例は、Eclipse Vert.x 4 で callback メソッドと future メソッドを非同期操作に使用する方法を示しています。
WebClient client = WebClient.create(vertx); HttpRequest request = client.get("/resource"); Future<HttpResponse> response = request.send(); response.onComplete(ar -> { if (ar.succeeded()) { HttpResponse response = ar.result(); } else { Throwable failure = ar.cause(); } });
Future でエラー処理が改善されました。Callback では構成の各段階で障害を処理する必要がありますが、future は障害を一度処理できます。基本的なアプリケーションでは、コールバックと future の使用との違いに気付かない場合があります。
以下の例は、callback を使用して 2 つの非同期操作を作成する方法を示しています。すべての構成でエラーが処理されることが確認できます。
client.get("/resource1").send(ar1 -> { if (ar1.succeeded()) { HttpResponse response = ar.result(); JsonObject json = response.body(); client.put("/resource2").sendJsonObject(ar2 -> { if (ar2.succeeded()) { // Handle final result } else { Throwable failure2 = ar.cause(); } }); } else { Throwable failure1 = ar.cause(); } });
以下の例は、Eclipse Vert.x 4 で callback および future を使用して 2 つの非同期操作を作成する方法を示しています。エラーは最後に一度のみ処理されます。
Future<HttpResponse> fut1 = client.get("/resource1").send(); Future<HttpResponse> fut2 = fut1.compose(response -> client.put("/resource2").sendJsonObject(response.body())); fut2.onComplete(ar -> { if (ar.succeeded()) { // Handle final result } else { Throwable failure = ar.cause(); } });
3.2. Jackson Databind ライブラリーの依存関係がない
Eclipse Vert.x の JSON 機能は、Jackson ライブラリーに依存します。Jackson Databind ライブラリーは JSON のオブジェクトマッピングを有効にします。
Eclipse Vert.x 4 では、Jackson Databind はオプションの Maven 依存関係です。この依存関係を使用する場合は、クラスパスに明示的に追加する必要があります。
オブジェクトマッピング JSON の場合は、
com.fasterxml.jackson.core:jackson-databind
jar でプロジェクト記述子に依存関係を明示的に追加する必要があります。<dependencies> ... <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ... </dependencies>
JSON のオブジェクトマッピングを使用しない場合は、この依存関係を削除できます。
- オブジェクトマッピング JSON がない場合、Jackson Databind ライブラリーは必要ありません。この jar を使用せずにアプリケーションを実行できます。
3.3. 非推奨と削除の処理
一部の機能および関数は Eclipse Vert.x 4 で非推奨または削除されました。アプリケーションを Eclipse Vert.x 4 に移行する前に、非推奨および削除を確認します。
- 一部の API は Eclipse Vert.x 3.x リリースで非推奨となり、そのリリースで同等の API が新たに提供されました。
- 非推奨の API は Eclipse Vert.x 4 で削除されました。
アプリケーションが非推奨の API を使用する場合は、新しい API を使用するようにアプリケーションを更新する必要があります。これは、アプリケーションを製品の最新バージョンに移行するのに役立ちます。
Java コンパイラーは、非推奨の API が使用されたときに警告を生成します。アプリケーションを Eclipse Vert.x 4 に移行する際に、コンパイラーを使用して非推奨のメソッドを確認できます。
以下の例は、Eclipse Vert.x 3.x リリースで非推奨となった EventBus メソッドを示しています。
// Send was deprecated in Vert.x 3.x release vertx.eventBus().send("some-address", "hello world", ar -> { // Handle response here });
Eclipse Vert.x 4 で send(String,String,Handler<AsyncResult<Message>>)
メソッドが、request(String,String,Handler<AsyncResult<Message>>
)に置き換えられました。
以下の例は、新しいメソッドを使用するようアプリケーションを更新する方法を示しています。
// New method can be used in Vert.x 3.x and Vert.x 4.x releases vertx.eventBus().request("some-address", "hello world", ar -> { // Handle response here });
第4章 一般的なコンポーネントの変更点
本セクションでは、基本的な Eclipse Vert.x コンポーネントの変更点を説明します。
4.1. メッセージングの変更点
本セクションでは、メッセージングメソッドの変更点を説明します。
4.1.1. 書き込みストリームの書き込みメソッドおよび終了メソッドが fluent でなくなる
WriteStream<T>.write()
メソッドおよび WriteStream<T>.end()
メソッドは fluent ではなくなりました。
-
書き込みおよび終了コールバックメソッドは
void
を返します。 -
他の書き込みメソッドおよび終了メソッドは
Future<AsyncResult>
を返します。
これは重大な変更です。書き込みストリームに fluent 側面を使用している場合は、アプリケーションを更新します。
4.1.2. MessageProducer
が WriteStream
を拡張しない
MessageProducer
インターフェースは WriteStream
インターフェースを拡張しません。
以前のリリースの Eclipse Vert.x では、MessageProducer
インターフェースは WriteStream
インターフェースを拡張しました。MessageProducer
インターフェースは、メッセージのバックプレッシャーに対する制限されたサポートを提供していました。クレジットリークにより、メッセージプロデューサーのクレジットが減ります。これらのリークがすべてクレジットを使用する場合、メッセージは送信されません。
ただし、MessageConsumer
は、ReadStream の拡張機能
を継続します。MessageConsumer
が一時停止し、保留中のメッセージキューが満杯になると、メッセージは破棄されます。これにより、Rx ジェネレーターとのインテグレーションが継続され、消費するパイプラインのメッセージが作成されます。
4.1.3. MessageProducer
から送信メソッドを削除
MessageProducer
インターフェースの送信メソッドが削除されました。
MessageProducer<T>.send(T)の代わりに
メソッドを使用してください。
MessageProducer<T>.write
(T)メソッドを使用し、MessageProducer .send
( T,Handler)の代わりに EventBus.request(String,Object
,Handler)
4.2. EventBus の変更点
以下のセクションでは、EventBus の変更点を説明します。
4.2.1. EventBus の request-response 送信メソッドを削除
EventBus.send(…, Handler<AsyncResult<Message<T>>>)
メソッドおよび Message.reply(…, Handler<AsyncResult<Message<T>>>)
メソッドが削除されました。これらのメソッドにより、Eclipse Vert.x 4 でオーバーロードの問題が生じました。Future<Message<T>>
メソッドのバージョンは、fire および forget バージョンと競合します。
Request-response メッセージングパターンでは、新しい request
メソッドおよび replyAndRequest
メソッドを使用する必要があります。
-
EventBus.
メソッドを使用してメッセージを送信します。send(…, Handler<AsyncResult<Message<T>>>)の代わりに EventBus.request
(…, Handler<AsyncResult<Message<T>>>) -
Message.
メソッドを使用してメッセージに応答します。reply(…, Handler<AsyncResult<Message<T>>>)の代わりに Message.replyAndRequest
(…, Handler<AsyncResult<Message<T>>>)
以下の例は、Eclipse Vert.x 3.x リリースのメッセージに対する要求および応答を示しています。
- 要求
eventBus.send("the-address", body, ar -> ...);
- 返信
eventBus.consumer("the-address", message -> { message.reply(body, ar -> ...); });
以下の例は、Eclipse Vert.x 4 のメッセージへの要求および応答を示しています。
- 要求
eventBus.request("the-address", body, ar -> ...);
- 返信
eventBus.consumer("the-address", message -> { message.replyAndRequest(body, ar -> ...); });
4.3. Future の変更点
本セクションでは、未来の変更点を説明します。
4.3.1. Future の複数のハンドラーのサポート
Eclipse Vert.x 4 以降では、今後、複数のハンドラーがサポートされます。単一のハンドラーを設定するために使用される Future<T>.setHandler()
メソッドは削除されました。代わりに、Future<T>.onComplete()
メソッド、Future<T>.onSuccess()
メソッド、および Future<T>.onFailure()
メソッドを使用して、動作の完了、成功、および失敗の結果でハンドラーを呼び出します。
以下の例は、Eclipse Vert.x 3.x リリースでハンドラーを呼び出す方法を示しています。
Future<String> fut = getSomeFuture(); fut.setHandler(ar -> ...);
以下の例は、Eclipse Vert.x 4 で新しい Future<T>.onComplete()
メソッドを呼び出す方法を示しています。
Future<String> fut = getSomeFuture(); fut.onComplete(ar -> ...);
4.3.2. Future の completer()
メソッドを削除
以前のリリースの Eclipse Vert.x では、Future.completer()
メソッドを使用して、Future
と関連付けられた Handler<AsyncResult<T>>
にアクセスします。
Eclipse Vert.x 4 では、Future<T>.completer()
メソッドが削除されました。Future<T>
は Handler<AsyncResult<T>> を直接拡張します
。Future
オブジェクトを使用してすべてのハンドラーメソッドにアクセスできます。Future
オブジェクトはハンドラーでもあります。
4.3.3. HTTP クライアント要求の接続ハンドラーメソッドを削除
HttpClientRequest.connectionHandler()
メソッドが削除されました。代わりに HttpClient.connectionHandler()
メソッドを使用して、アプリケーションのクライアントリクエストの接続ハンドラーを呼び出します。
以下の例は、HttpClientRequest.connectionHandler()
メソッドが Eclipse Vert.x 3.x リリースでどのように使用されたかを示しています。
client.request().connectionHandler(conn -> { // Connection related code }).end();
以下の例は、Eclipse Vert.x 4 で新しい HttpClient.connectionHandler()
メソッドを使用する方法を示しています。
client.connectionHandler(conn -> { // Connection related code });
4.4. Verticle の変更点
本セクションでは、verticle の変更点を説明します。
4.4.1. Create verticle メソッドの更新
以前のリリースの Eclipse Vert.x では、VerticleFactory.createVerticle()
メソッドが verticle を同期的にインスタンス化しました。Eclipse Vert.x 4 以降では、メソッドは非同期的に verticle をインスタンス化し、単一の verticle インスタンスではなく、コールバック Callable<Verticle>
を返します。この改善により、アプリケーションはこのメソッドを一度呼び出し、複数のインスタンスを作成するために、返された呼び出し可能な複数回呼び出すことができます。
以下のコードは、Eclipse Vert.x 3.x リリースで verticle がインスタンス化される方法を示しています。
Verticle createVerticle(String verticleName, ClassLoader classLoader) throws Exception;
以下のコードは、Eclipse Vert.x 4 で verticle がインスタンス化される方法を示しています。
void createVerticle(String verticleName, ClassLoader classLoader, Promise<Callable<Verticle>> promise);
4.4.2. ファクトリークラスおよびメソッドの更新
VerticleFactory
クラスが簡素化されました。ファクトリーはネストされたデプロイメントを使用して verticle をデプロイすることができるため、クラスは識別子の初期解決を必要としません。
既存のアプリケーションが factory を使用する場合、Eclipse Vert.x 4 では、promise の完了または失敗時に callable を使用するようにコードを更新できます。呼び出し可能なものは複数回呼び出すことができます。
以下の例は、Eclipse Vert.x 3.x アプリケーションの既存のファクトリーを示しています。
return new MyVerticle();
以下の例は、Eclipse Vert.x 4 で promise を使用するように既存のファクトリーを更新する方法を示しています。
promise.complete(() -> new MyVerticle());
Factory がコードをブロックするようにするには、Vertx .executeBlocking()
メソッドを使用します。ファクトリーがブロックコードを受け取ると、promise を解決し、promise から verticle インスタンスを取得する必要があります。
4.4.3. マルチスレッドのワーカー verticle を削除
マルチスレッドのワーカー verticle デプロイメントオプションが削除されました。この機能は、Eclipse Vert.x event-bus とのみ使用できます。HTTP などの他の Eclipse Vert.x コンポーネントはこの機能をサポートしません。
順序のない Vertx.executeBlocking()
メソッドを使用して、マルチスレッドワーカーのデプロイメントと同じ機能を実現します。
4.5. スレッドの変更点
本セクションでは、スレッドの変更点を説明します。
4.5.1. 非 Eclipse Vert.x スレッドのコンテキストアフィニティー
Vertx.getOrCreateContext()
メソッドは、非 Eclipse Vert.x スレッドごとに単一のコンテキストを作成します。非 Eclipse Vert.x スレッドは、コンテキストの初回作成時にコンテキストに関連付けられます。以前のリリースでは、Eclipse Vert.x 以外のスレッドからメソッドが呼び出されるたびに、新しいコンテキストが作成されていました。
new Thread(() -> { assertSame(vertx.getOrCreateContext(), vertx.getOrCreateContext()); }).start();
アプリケーションが呼び出しごとに作成される新しいコンテキストに暗黙的に依存しない限り、この変更はアプリケーションに影響を与えません。
以下の例では、各ブロックコードが異なるコンテキストで呼び出されるため、n ブロックが同時に実行されます。
for (int i = 0;i < n;i++) { vertx.executeBlocking(block, handler); }
Eclipse Vert.x 4 で同じ結果を取得するには、コードを更新する必要があります。
for (int i = 0;i < n;i++) { vertx.executeBlocking(block, false, handler); }
4.6. HTTP の変更点
本セクションでは、HTTP メソッドの変更点を説明します。
4.6.1. Eclipse Vert.x HTTP メソッドにおける一般的な更新
以下のセクションでは、Eclipse Vert.x HTTP メソッドにおけるその他の更新を説明します。
4.6.1.1. WebSocket
の HTTP メソッドの更新
WebSocket
の変更点は次のとおりです。
メソッド名で
WebSocket
という用語の使用に一貫性がありませんでした。メソッド名に、WebSocket ではなく
。以下のクラスでWebsocket
などの誤った大文字が含まれていましたWebSocket
の使用に一貫性のないメソッドが削除されました。代わりに正しい大文字を持つ新しいメソッドを使用してください。HttpServerOptions クラスの
以下のメソッドが削除されました。削除されたメソッド 新しいメソッド getMaxWebsocketFrameSize()
getMaxWebSocketFrameSize()
setMaxWebsocketFrameSize()
setMaxWebSocketFrameSize()
getMaxWebsocketMessageSize()
getMaxWebSocketMessageSize()
setMaxWebsocketMessageSize()
setMaxWebSocketMessageSize()
getPerFrameWebsocketCompressionSupported()
getPerFrameWebSocketCompressionSupported()
setPerFrameWebsocketCompressionSupported()
setPerFrameWebSocketCompressionSupported()
getPerMessageWebsocketCompressionSupported()
getPerMessageWebSocketCompressionSupported()
setPerMessageWebsocketCompressionSupported()
setPerMessageWebSocketCompressionSupported()
getWebsocketAllowServerNoContext()
getWebSocketAllowServerNoContext()
setWebsocketAllowServerNoContext()
setWebSocketAllowServerNoContext()
getWebsocketCompressionLevel()
getWebSocketCompressionLevel()
setWebsocketCompressionLevel()
setWebSocketCompressionLevel()
getWebsocketPreferredClientNoContext()
getWebSocketPreferredClientNoContext()
setWebsocketPreferredClientNoContext()
setWebSocketPreferredClientNoContext()
getWebsocketSubProtocols()
getWebSocketSubProtocols()
setWebsocketSubProtocols()
setWebSocketSubProtocols()
WebSocket
サブプロトコルの新しいメソッドは、項目を保存するためにコンマ区切りの文字列の代わりにList<String>
データ型を使用します。HttpClientOptions
クラスの以下のメソッドが削除されました。削除されたメソッド 置き換えメソッド getTryUsePerMessageWebsocketCompression()
getTryUsePerMessageWebSocketCompression()
setTryUsePerMessageWebsocketCompression()
setTryUsePerMessageWebSocketCompression()
getTryWebsocketDeflateFrameCompression()
getTryWebSocketDeflateFrameCompression()
getWebsocketCompressionAllowClientNoContext()
getWebSocketCompressionAllowClientNoContext()
setWebsocketCompressionAllowClientNoContext()
setWebSocketCompressionAllowClientNoContext()
getWebsocketCompressionLevel()
getWebSocketCompressionLevel()
setWebsocketCompressionLevel()
setWebSocketCompressionLevel()
getWebsocketCompressionRequestServerNoContext()
getWebSocketCompressionRequestServerNoContext()
setWebsocketCompressionRequestServerNoContext()
setWebSocketCompressionRequestServerNoContext()
HttpServer クラスの
以下のハンドラーメソッドが削除されました。非推奨となったメソッド 新しいメソッド websocketHandler()
webSocketHandler()
websocketStream()
webSocketStream()
-
WebsocketRejectedException
は非推奨になりました。メソッドは、代わりにUpgradeRejectedException
を出力します。 -
HttpClient web
Socket()
メソッドは、Handler またはHandler<
を使用します。Throwable> の代わりに
gt;Handler
<AsyncResult<WebSocket>& -
また、WebSocket
ConnectOptions
クラスのメソッドを使用して、HTTP クライアントを WebSocket に接続するオーバーロードされたメソッドの数も削減されました。 HttpServerRequest.upgrade()
メソッドが削除されました。このメソッドは同期的でした。代わりに、新しいメソッド
HttpServerRequest.toWebSocket()
を使用してください。この新しいメソッドは非同期的です。以下の例は、Eclipse Vert.x 3.x での同期メソッドの使用を示しています。
// 3.x server.requestHandler(req -> { WebSocket ws = req.upgrade(); });
以下の例は、Eclipse Vert.x 4 での非同期メソッドの使用を示しています。
// 4.x server.requestHandler(req -> { Future<WebSocket> fut = req.toWebSocket(); fut.onSuccess(ws -> { }); });
4.6.1.2. WebSocket 接続の数の設定
Eclipse Vert.x 3.x では、HTTP クライアントプールサイズを使用してアプリケーションで WebSocket 接続の最大数を定義することができます。値アクセサーメソッド HttpClientOptions.maxPoolSize()
は、WebSocket 接続の取得および設定に使用されました。デフォルトの接続数は、エンドポイントごとに 4 に設定されていました。
以下の例は、Eclipse Vert.x 3.x で WebSocket 接続が設定される方法を示しています。
// 3.x options.setMaxPoolSize(30); // Maximum connection is set to 30 for each endpoint
ただし、Eclipse Vert.x 4 では、使用後に接続が閉じられるため、WebSocket TCP 接続のプールはありません。アプリケーションは、HTTP リクエストに異なるプールを使用します。値アクセサーメソッド HttpClientOptions.maxWebSockets()
を使用して WebSocket 接続を取得および設定します。デフォルトの接続数は、エンドポイントごとに 50 に設定されます。
以下の例は、Eclipse Vert.x 4 で WebSocket 接続を設定する方法を示しています。
// 4.x options.setMaxWebSockets(30); // Maximum connection is set to 30 for each endpoint
4.6.1.3. HttpMethod
がインターフェースとして利用可能
HttpMethod
は新しいインターフェースとして利用できます。
以前のリリースの Eclipse Vert.x では、HttpMethod
は列挙データ型として宣言されていました。列挙として、HTTP の拡張性が制限されます。さらに、このタイプの他の HTTP メソッドを直接提供できませんでした。サーバーおよびクライアントの HTTP 要求時に、HttpMethod.OTHER
の値を rawMethod
属性と共に使用する必要がありました。
スイッチ ブロックで HttpMethod
列挙データ型を使用している場合は、以下のコードを使用してアプリケーションを Eclipse Vert.x 4 に移行できます。
以下の例は、Eclipse Vert.x 3.x リリースの switch ブロックを示しています。
switch (method) { case GET: ... break; case OTHER: String s = request.getRawMethod(); if (s.equals("PROPFIND") { ... } else ... }
以下の例は、Eclipse Vert.x 4 の switch ブロックを示しています。
switch (method.name()) { case "GET": ... break; case "PROPFIND"; ... break; }
Eclipse Vert.x 4 で以下のコードを使用することもできます。
HttpMethod PROPFIND = HttpMethod.valueOf("PROPFIND"); if (method == HttpMethod.GET) { ... } else if (method.equals(PROPFIND)) { ... } else { ... }
アプリケーションで HttpMethod.OTHER
値を使用している場合は、以下のコードを使用してアプリケーションを Eclipse Vert.x 4 に移行します。
以下の例は、Eclipse Vert.x 3.x リリースのコードを示しています。
client.request(HttpMethod.OTHER, ...).setRawName("PROPFIND");
以下の例は、Eclipse Vert.x 4 のコードを示しています。
client.request(HttpMethod.valueOf("PROPFIND"), ...);
4.6.2. HTTP クライアントの変更点
本セクションでは、HTTP クライアントの変更点を説明します。
以下のタイプの Eclipse Vert.x クライアントを利用できます。
- Eclipse Vert.x Web クライアント
- アプリケーションが Web 指向の場合は、Eclipse Vert.x Web クライアントを使用します。たとえば、REST、HTTP ペイロードのエンコーディングおよびデコード、HTTP ステータス応答コードの解釈などです。
- Eclipse Vert.x HTTP クライアント
- アプリケーションが HTTP プロキシーとして使用される場合は、Eclipse Vert.x HTTP クライアントを使用します。たとえば、API ゲートウェイとして。Eclipse Vert.x 4 では、HTTP クライアントが更新され、改善されました。
Eclipse Vert.x Web クライアントは Eclipse Vert.x HTTP クライアントに基づいています。
4.6.2.1. アプリケーションの Eclipse Vert.x Web クライアントへの移行
Web クライアントは Eclipse Vert.x 3.4.0 リリースから入手できました。Eclipse Vert.x 4 の Web クライアントには変更はありません。
クライアントは、簡素化された HTTP 対話と、Eclipse Vert.x HTTP クライアントでは利用できない HTTP セッション、JSON エンコーディングおよびデコーディング、応答述語などの一部の追加機能を提供します。
以下の例は、Eclipse Vert.x 3.x リリースで HTTP クライアントを使用する方法を示しています。
HttpClientRequest request = client.get(80, "example.com", "/", response -> { int statusCode = response.statusCode(); response.exceptionHandler(err -> { // Handle connection error, for example, connection closed }); response.bodyHandler(body -> { // Handle body entirely }); }); request.exceptionHandler(err -> { // Handle connection error OR response error }); request.end();
以下の例は、Eclipse Vert.x 3.x および Eclipse Vert.x 4 リリースの Web クライアントにアプリケーションを移行する方法を示しています。
client.get(80, "example.com", "/some-uri") .send(ar -> { if (ar.suceeded()) { HttpResponse<Buffer> response = ar.result(); // Handle response } else { // Handle error } });
4.6.2.2. アプリケーションの Eclipse Vert.x HTTP クライアントへの移行
HTTP クライアントは、HTTP の対話を詳細に制御し、HTTP プロトコルに重点を置いています。
Eclipse Vert.x 4 で HTTP クライアントが更新され、改善されました。
- より少ない対話による簡素化された API
- 強固なエラー処理
- HTTP/1 の接続リセットのサポート
HTTP クライアント API の更新は以下のとおりです。
-
HttpClientRequest
のメソッド(get()、delete
、()
put()
など)が削除されました。代わりにHttpClientRequest> request(HttpMethod method, …)
メソッドを使用してください。 -
要求または応答が可能になると、
HttpClientRequest
インスタンスが作成されます。たとえば、HttpClientRequest
インスタンスは、クライアントがサーバーに接続するか、プールから接続を再利用するときに作成されます。
4.6.2.2.1. シンプルな要求の送信
以下の例は、Eclipse Vert.x 3.x リリースで GET 要求を送信する方法を示しています。
HttpClientRequest request = client.get(80, "example.com", "/", response -> { int statusCode = response.statusCode(); response.exceptionHandler(err -> { // Handle connection error, for example, connection closed }); response.bodyHandler(body -> { // Handle body entirely }); }); request.exceptionHandler(err -> { // Handle connection error OR response error }); request.end();
以下の例は、Eclipse Vert.x 4 で GET 要求を送信する方法を示しています。
client.request(HttpMethod.GET, 80, "example.com", "/", ar -> { if (ar.succeeded()) { HttpClientRequest = ar.result(); request.send(ar2 -> { if (ar2.succeeded()) { HttpClientResponse = ar2.result(); int statusCode = response.statusCode(); response.body(ar3 -> { if (ar3.succeeded()) { Buffer body = ar3.result(); // Handle body entirely } else { // Handle server error, for example, connection closed } }); } else { // Handle server error, for example, connection closed } }); } else { // Connection error, for example, invalid server or invalid SSL certificate } });
新しい HTTP クライアントでエラー処理が優れていることが分かります。
以下の例は、Eclipse Vert.x 4 の GET 操作で future 構成を使用する方法を示しています。
Future<Buffer> fut = client.request(HttpMethod.GET, 80, "example.com", "/") .compose(request -> request.send().compose(response -> { int statusCode = response.statusCode(); if (statusCode == 200) { return response.body(); } else { return Future.failedFuture("Unexpectd status code"); } }) }); fut.onComplete(ar -> { if (ar.succeeded()) { Buffer body = ar.result(); // Handle body entirely } else { // Handle error } });
今後の構成により、例外処理が改善されます。この例では、ステータスコードが 200 でなければエラーを返します。
Future で HTTP クライアントを使用すると、HttpClientResponse()
メソッドは応答を受信するとすぐにバッファーを生成します。これを回避するには、(例にあるように)event-loop で future の構成が生じるか、応答を一時停止して再開する必要があります。
4.6.2.2.2. リクエストの送信
Eclipse Vert.x 3.x リリースでは、end()
メソッドを使用して要求を送信できます。
request.end();
リクエストにボディーを送信することもできます。
request.end(Buffer.buffer("hello world));
HttpClientRequest
は Writestream<Buffer>
であるため、要求をストリーミングするのにパイプを使用することもできます。
writeStream.pipeTo(request, ar -> { if (ar.succeeded()) { // Sent the stream } });
Eclipse Vert.x 4 では、get ()
メソッドを使用して例に示されるすべての操作を実行できます。新しい send()
メソッドを使用してこれらの操作を実行することもできます。Send()
メソッドへの入力として、バッファー、文字列、または ReadStream
を渡すことができます。このメソッドは、HttpClientResponse
インスタンスを返します。
// Send a request and process the response request.onComplete(ar -> { if (ar.succeeded()) { HttpClientResponse response = ar.result(); // Handle the response } }) request.end(); // The new send method combines all the operations request.send(ar -> { if (ar.succeeded()) { HttpClientResponse response = ar.result(); // Handle the response } }));
4.6.2.2.3. 応答の処理
HttpClientResponse
インターフェースが更新され、以下の方法で改善されました。
body()
メソッドBody
()
メソッドは非同期バッファーを返します。BodyHandler
メソッドを使用します。()
の代わりに body()以下の例は、
bodyHandler()
メソッドを使用して要求ボディーを取得する方法を示しています。response.bodyHandler(body -> { // Process the request body }); response.exceptionHandler(err -> { // Could not get the request body });
以下の例は、
body()
メソッドを使用してリクエストボディーを取得する方法を示しています。response.body(ar -> { if (ar.succeeded()) { // Process the request body } else { // Could not get the request body } });
end()
methodEnd()
メソッドは、応答が正常にまたは失敗した場合に future を返します。このメソッドは応答ボディーを削除します。EndHandler()メソッドの代わりに
このメソッドを使用してください。以下の例は、
endHandler()
メソッドを使用する方法を示しています。response.endHandler(v -> { // Response ended }); response.exceptionHandler(err -> { // Response failed, something went wrong });
以下の例は、
end()
メソッドの使用方法を示しています。response.end(ar -> { if (ar.succeeded()) { // Response ended } else { // Response failed, something went wrong } });
OnSucces ()
、compose()、
などのメソッドで応答を処理することもできます。以下の例は、on bodyHandler()
Success()
メソッドを使用して応答を処理する方法を示しています。
以下の例は、Eclipse Vert.x 3.x リリースで result()
メソッドで HTTP クライアントを使用する方法を示しています。
HttpClient client = vertx.createHttpClient(options); client.request(HttpMethod.GET, 8443, "localhost", "/") .onSuccess(request -> { request.onSuccess(resp -> { //Code to handle HTTP response }); });
以下の例は、Eclipse Vert.x 4 の result()
メソッドで HTTP クライアントを使用する方法を示しています。
HttpClient client = vertx.createHttpClient(options); client.request(HttpMethod.GET, 8443, "localhost", "/") .onSuccess(request -> { request.response().onSuccess(resp -> { //Code to handle HTTP response }); });
4.6.2.3. Eclipse Vert.x HTTP クライアントの改善
本セクションでは、HTTP クライアントの改善を説明します。
4.6.2.3.1. HTTP クライアント要求と応答メソッドが非同期ハンドラーを入力引数として取ります。
HttpClient
メソッドおよび HttpClientRequest
メソッドが更新され、非同期ハンドラーが使用されるようになりました。このメソッドは、Handler<HttpClientResponse> の代わりに
。
Handler<AsyncResult<HttpClientResponse>&
gt; を入力として取ります
以前のリリースの Eclipse Vert.x では、リクエストを実行するためにさらに送信する必要がある HttpClient
Request を返すのに HttpClient
メソッド get
が使用されていました。Get Now()
、optionsNow()、および
headNow()Now()メソッド
、optionsNow()メソッド
、および headNow()
メソッドが削除されました。Eclipse Vert.x 4 では、Handler<AsyncResult<HttpClientResponse>>
を使用して、必要な情報で要求を直接送信できます。
以下の例は、Eclipse Vert.x 3.x で要求を送信する方法を示しています。
GET 操作を実行するには、以下を実行します。
Future<HttpClientResponse> f1 = client.get(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"));
バッファーボディーを持つ POST を行うには、以下を行います。
Future<HttpClientResponse> f2 = client.post(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"), Buffer.buffer("some-data"));
ストリーミングボディーを使用した POST を行うには、以下を行います。
Future<HttpClientResponse> f3 = client.post(8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"), asyncFile);
Eclipse Vert.x 4 では、requests
メソッドを使用して HttpClientRequest
インスタンスを作成できます。これらのメソッドは、以下のような基本的な対話で使用できます。
- リクエストヘッダーの送信
- プッシュハンドラー、ストリームの優先度、ping の設定などの HTTP/2 固有の操作。
- NetSocket トンネルの作成
- 粒度の細かい書き込み制御を提供
- ストリームのリセット
- 100 継続ヘッダーの手動処理
以下の例は、Eclipse Vert.x 4 で HTTPClientRequest
を作成する方法を示しています。
client.request(HttpMethod.GET, 8080, "example.com", "/resource", ar -> { if (ar.succeeded()) { HttpClientRequest request = ar.result(); request.putHeader("content-type", "application/json") request.send(new JsonObject().put("hello", "world")) .onSuccess(response -> { // }).onFailure(err -> { // }); } })
4.6.2.3.2. HTTP クライアントリクエストから接続ハンドラーメソッドを削除
HttpClientRequest.connectionHandler()
メソッドが削除されました。代わりに HttpClient.connectionHandler()
メソッドを使用して、アプリケーションのクライアントリクエストの接続ハンドラーを呼び出します。
以下の例は、HttpClientRequest.connectionHandler()
メソッドが Eclipse Vert.x 3.x リリースでどのように使用されたかを示しています。
client.request().connectionHandler(conn -> { // Connection related code }).end();
以下の例は、新しい HttpClient.connectionHandler()
メソッドを使用する方法を表しています。
client.connectionHandler(conn -> { // Connection related code });
4.6.2.3.3. Net ソケットメソッドを使用した HTTP クライアントトンネリング
HTTP トンネルは、HttpClientResponse.netSocket()
メソッドを使用して作成できます。Eclipse Vert.x 4 では、このメソッドが更新されました。
要求の接続に net ソケットを取得するには、要求でソケットハンドラーを送信します。ハンドラーは、HTTP 応答ヘッダーの受信時に呼び出されます。ソケットはトンネリングの準備ができ、バッファーの送受信が可能です。
以下の例は、Eclipse Vert.x 3.x リリースで接続の net ソケットを取得する方法を示しています。
client.request(HttpMethod.CONNECT, uri, ar -> { if (ar.succeeded()) { HttpClientResponse response = ar.result(); if (response.statusCode() == 200) { NetSocket so = response.netSocket(); } } }).end();
以下の例は、Eclipse Vert.x 4 で接続の net ソケットを取得する方法を示しています。
client.request(HttpMethod.CONNECT, uri, ar -> { }).netSocket(ar -> { if (ar.succeeded()) { // Got a response with a 200 status code NetSocket so = ar.result(); // Go for tunneling } }).end();
4.6.2.3.4. HttpClient
クラスの新しい send()
メソッド
HttpClient
クラスで新しい send()
メソッドを利用できるようになりました。
以下のコードは、Eclipse Vert.x 4 で要求を送信する方法を示しています。
Future<HttpClientResponse> f1 = client.send(HttpMethod.GET, 8080, "localhost", "/uri", HttpHeaders.set("foo", "bar"));
4.6.2.3.5. httpHeaders はインターフェースで、MultiMap
メソッドを含む
Eclipse Vert.x 4 では、HttpHeaders
はインターフェースです。以前のリリースの Eclipse Vert.x では、HttpHeaders
はクラスでした。
以下の新しい MultiMap
メソッドが HttpHeaders
インターフェースに追加されました。これらのメソッドを使用して MultiMap
インスタンスを作成します。
-
MultiMap.headers()
-
MultiMap.set(CharSequence name, CharSequence value)
-
MultiMap.set(String name, String value)
以下の例は、Eclipse Vert.x 3.x リリースで MultiMap
インスタンスが作成された方法を示しています。
MultiMap headers = MultiMap.caseInsensitiveMultiMap();
以下の例は、Eclipse Vert.x 4 で MultiMap
インスタンスを作成する方法を示しています。
MultiMap headers = HttpHeaders.headers();
MultiMap headers = HttpHeaders.set("content-type", "application.data");
4.6.2.3.6. CaseInsensitiveHeaders
クラスが公開されなくなる
CaseInsensitiveHeaders
クラスが公開されなくなりました。MultiMap.caseInsensitiveMultiMap()
メソッドを使用して、大文字と小文字を区別しないキーを持つマルチマップ実装を作成します。
以下の例は、Eclipse Vert.x 3.x リリースで CaseInsensitiveHeaders
メソッドがどのように使用されたかを示しています。
CaseInsensitiveHeaders headers = new CaseInsensitiveHeaders();
以下の例は、Eclipse Vert.x 4 で MultiMap
メソッドを使用する方法を示しています。
MultiMap multiMap = MultiMap#caseInsensitiveMultiMap();
あるいは
MultiMap headers = HttpHeaders.headers();
4.6.2.3.7. サーバーで実行している HTTP のバージョンの確認
以前のリリースの Eclipse Vert.x では、HttpServerRequest.version()
メソッドを明示的に呼び出している場合に限り、サーバーで実行している HTTP のバージョンがチェックされました。HTTP バージョンが HTTP/1.x の場合、メソッドは 501 HTTP ステータスを返し、接続を閉じます。
Eclipse Vert.x 4 以降では、要求がサーバーに送信される前に、サーバー上の HTTP バージョンは HttpServerRequest.version()
メソッドを呼び出して自動的にチェックされます。このメソッドは、無効な HTTP バージョンが見つかったときに例外を出力する代わりに、HTTP バージョンを返します。
4.6.2.3.8. 要求オプションの新しいメソッド
Eclipse Vert.x 4 では、以下の新しいメソッドが RequestOptions
クラスで利用できます。
- ヘッダー
- FollowRedirects
- タイムアウト
以下の例は、新しいメソッドの使用方法を示しています。
client.request(HttpMethod.GET, 8080, "example.com", "/resource", ar -> { if (ar.succeeded()) { HttpClientRequest request = ar.result(); request.putHeader("content-type", "application/json") request.send(new JsonObject().put("hello", "world")) .onSuccess(response -> { // }).onFailure(err -> { // }); } })
4.7. 接続メソッドの変更点
本セクションでは、接続方法の変更点を説明します。
4.7.1. クライアントに認証が必要であるかどうかの確認
NetServerOptions.isClientAuthRequired()
メソッドが削除されました。Get ClientAuth()== ClientAuth.REQUIRED
列挙タイプを使用して、クライアント認証が必要であるかどうかを確認します。
以下の例は、switch ステートメントを使用して、クライアントの認証が必要であるかどうかを確認する方法を示しています。
switch (options.getClientAuth()) { case REQUIRED: // ... behavior same as in releases prior to {VertX} {v4} break; default: // fallback statement... }
以下の例は、Eclipse Vert.x 4 でクライアントの認証が必要な場合にチェックを使用する方法を示しています。
if (options.getClientAuth() == ClientAuth.REQUIRED) { // behavior in releases prior to {VertX} {v4}
4.7.2. アップグレード SSL メソッドによる非同期ハンドラーの使用
The NetSocket.upgradeToSsl()
メソッドが更新され、Handler ではなく
が使用されるようになりました。ハンドラーは、チャネルが SSL または TLS に正常にアップグレードされているかどうかを確認するために使用されます。
Handler
<AsyncResult>
4.8. ロギングの変更
本セクションでは、ロギングの変更点を説明します。
4.8.1. 非推奨のロギングクラスおよびメソッド
ロギングクラス Logger
および LoggerFactory
と、それらのメソッドが非推奨になりました。これらのロギングクラスおよびメソッドは今後のリリースで削除されます。
4.8.2. 削除された Log4j 1 ロガー
Log4j 1
ロガーは利用できなくなりました。ただし、Log4j 1
ロガーを使用する場合は SLF4J
で利用できます。
4.9. Eclipse Vert.x Reactive Extensions(Rx)の変更点
本セクションでは、Eclipse Vert.x の Reactive Extensions(Rx)の変更点を説明します。Eclipse Vert.x は RxJava ライブラリーを使用します。
4.9.1. RxJava 3 のサポート
Eclipse Vert.x 4.1.0 以降では、RxJava 3 がサポートされます。
-
新しい rxified API が
io.vertx.rxjava3
パッケージで利用できます。 -
Eclipse Vert.x JUnit5 との統合は、vertx
-junit5-rx-java3
バインディングによって提供されます。
RxJava 3 にアップグレードするには、以下の変更を加える必要があります。
-
Pom
.xml
ファイルでは、<dependency>
の下で RxJava 1 と 2 のバインディングをvertx-rx-java
またはvertx-rx-java2
からvertx-rx-java3
に変更します。 -
アプリケーションで、インポートを
io.vertx.reactivex.*
からio.vertx.rxjava3.* に更新します
。 - お使いのアプリケーションで、RxJava 3 タイプのインポートも更新します。詳細は、RxJava 3 ドキュメントの「 What's new section」を参照してください。
4.9.2. 書き込み ストリームから onComplete
コールバックを削除
WriteStreamSubscriber.onComplete()
コールバックが削除されました。このコールバックは、WriteStream
が書き込まれるデータのストリームが保留中の場合に呼び出されました。
Eclipse Vert.x 4 では、代わりに WriteStreamSubscriber.onWriteStreamEnd()
コールバックおよび WriteStreamSubscriber.onWriteStreamError()
コールバックを使用します。これらのコールバックは、WriteStream.end()
の完了後に呼び出されます。
WriteStreamSubscriber<Buffer> subscriber = writeStream.toSubscriber();
以下の例は、Eclipse Vert.x 3.x リリースの WriteStream
からアダプターを作成する方法を示しています。
subscriber.onComplete(() -> { // Called after writeStream.end() is invoked, even if operation has not completed });
以下の例は、Eclipse Vert.x 4 リリースの新しいコールバックメソッドを使用して WriteStream からアダプターを作成する方法を示しています。
subscriber.onWriteStreamEnd(() -> { // Called after writeStream.end() is invoked and completes successfully });
subscriber.onWriteStreamError(() -> { // Called after writeStream.end() is invoked and fails });
4.10. Eclipse Vert.x 設定の変更点
以下のセクションでは、Eclipse Vert.x 設定の変更点を説明します。
4.10.1. 設定を取得する新しい方法
ConfigRetriever.getConfigAsFuture()
メソッドが削除されました。代わりに retriever.getConfig()
メソッドを使用してください。
以下の例は、Eclipse Vert.x 3.x リリースで設定を取得する方法を示しています。
Future<JsonObject> fut = ConfigRetriever. getConfigAsFuture(retriever);
以下の例は、Eclipse Vert.x 4 で設定を取得する方法を示しています。
fut = retriever.getConfig();
4.11. JSON の変更点
本セクションでは、JSON の変更点を説明します。
4.11.1. Jackson のカプセル化
Jackson 型を実装する JSON クラスのメソッドがすべて削除されました。代わりに以下の方法を使用してください。
削除されたフィールド/メソッド | 新しいメソッド |
---|---|
|
|
|
|
|
|
|
|
たとえば、以下のコードを使用します。
Jackson の
TypeReference
を使用する場合:Eclipse Vert.x 3.x リリースの場合:
List<Foo> foo1 = Json.decodeValue(json, new TypeReference<List<Foo>>() {});
Eclipse Vert.x 4 リリースの場合:
List<Foo> foo2 = io.vertx.core.json.jackson.JacksonCodec.decodeValue(json, new TypeReference<List<Foo>>() {});
ObjectMapper
の参照:Eclipse Vert.x 3.x リリースの場合:
ObjectMapper mapper = Json.mapper;
Eclipse Vert.x 4 リリースの場合:
mapper = io.vertx.core.json.jackson.DatabindCodec.mapper();
ObjectMapper
の設定:Eclipse Vert.x 3.x リリースの場合:
Json.mapper = someMapper;
-
Eclipse Vert.x 4 以降では、マッパーインスタンスを作成することはできません。独自の静的マッパーを使用するか、Databind
.mapper()
インスタンスを設定する必要があります。
4.11.2. オブジェクトマッピング
以前のリリースでは、Jackson コアおよび Jackson databind の依存関係はランタイム時に必要でした。
Eclipse Vert.x 4 以降では、Jackson コア依存関係のみが必要になります。
オブジェクトマッピング JSON の場合のみ、Jackson databind の依存関係が必要です。この場合、com.fasterxml.jackson.core:jackson-databind
jar でプロジェクト記述子に依存関係を明示的に追加する必要があります。
以下のメソッドは上記の型でサポートされます。
メソッド
-
JsonObject.mapFrom(Object)
-
JsonObject.mapTo(Class)
-
Json.decodeValue(Buffer, Class)
-
Json.decodeValue(String, Class)
-
Json.encode(Object)
-
Json.encodePrettily(Object)
-
Json.encodeToBuffer(Object)
-
タイプ
-
JsonObject
andJsonArray
-
Map
およびList
-
数字
-
ブール値
-
Enum
-
byte[]
およびBuffer
-
Instant
-
以下のメソッドは、Jackson バインドでのみサポートされます。
-
JsonObject.mapTo(Object)
-
JsonObject.mapFrom(Object)
4.11.3. Base64 エンコーダーが JSON オブジェクトおよびアレイの Base64URL に更新
Eclipse Vert.x JSON タイプは RFC-7493 を実装します。以前のリリースの Eclipse Vert.x では、実装は Base64URL ではなく Base64 エンコーダーが誤って使用されていました。これは Eclipse Vert.x 4 で修正され、JSON タイプで Base64URL エンコーダーが使用されるようになりました。
Eclipse Vert.x 4 で Base64 エンコーダーを引き続き使用する場合は、設定フラグの legacy
を使用できます。以下の例は、Eclipse Vert.x 4 で設定フラグを設定する方法を示しています。
java -Dvertx.json.base64=legacy ...
アプリケーションを部分的に移行している場合は、Eclipse Vert.x 3.x から Eclipse Vert.x 4 への移行中に、バージョン 3 と 4 の両方にアプリケーションが必要になります。Eclipse Vert.x のバージョンが 2 つある場合は、次のユーティリティーを使用して Base64 文字列を Base64URL に変換できます。
public String toBase64(String base64Url) { return base64Url .replace('+', '-') .replace('/', '_'); } public String toBase64Url(String base64) { return base64 .replace('-', '+') .replace('_', '/'); }
以下のシナリオでは、ユーティリティーメソッドを使用する必要があります。
- Eclipse Vert.x 3.x リリースから Eclipse Vert.x 4 への移行中に統合の処理。
- Base64 文字列を使用する他のシステムとの相互運用性の処理。
以下のコード例を使用して、Base64URL を Base64 エンコーダーに変換します。
String base64url = someJsonObject.getString("base64encodedElement") String base64 = toBase64(base64url);
To Base64 および
のヘルパー関数は、JSON の移行だけを有効にします。オブジェクトマッピングを使用して JSON オブジェクトをアプリケーションの Java POJO に自動的にマッピングする場合、Base64 文字列を Base64URL に変換するためにカスタムオブジェクトマッパーを作成する必要があります。
toBase64
Url
以下の例は、カスタム Base64 デコーダーでオブジェクトマッパーを作成する方法を示しています。
// simple deserializer from Base64 to byte[] class ByteArrayDeserializer extends JsonDeserializer<byte[]> { ByteArrayDeserializer() { } public byte[] deserialize(JsonParser p, DeserializationContext ctxt) { String text = p.getText(); return Base64.getDecoder() .decode(text); } } // ... ObjectMapper mapper = new ObjectMapper(); // create a custom module to address the Base64 decoding SimpleModule module = new SimpleModule(); module.addDeserializer(byte[].class, new ByteArrayDeserializer()); mapper.registerModule(module); // JSON to POJO with custom deserializer mapper.readValue(json, MyClass.class);
4.11.4. 信頼オプションから JSON コンバーターメソッドを削除
TrustOptions.toJSON
メソッドが削除されました。
4.12. Eclipse Vert.x Web の変更点
以下のセクションでは、Eclipse Vert.x Web の変更点を説明します。
4.12.1. セッションハンドラーでのユーザーセッションハンドラーの機能の組み合わせ
以前のリリースの Eclipse Vert.x では、セッションで作業する際に UserSessionHandler
ハンドラーと SessionHandler
ハンドラーの両方を指定する必要がありました。
プロセスを単純化するために、Eclipse Vert.x 4 では UserSessionHandler
クラスが削除され、その機能が SessionHandler
クラスに追加されました。Eclipse Vert.x 4 では、セッションを使用するには 1 つのハンドラーのみを指定する必要があります。
4.12.2. Cookie インターフェースの削除
以下の Cookie インターフェースが削除されました。
-
io.vertx.ext.web.Cookie
-
io.vertx.ext.web.handler.CookieHandler
代わりに io.vertx.core.http.Cookie
インターフェースを使用してください。
4.12.3. Favicon およびエラーハンドラーが Vertx
ファイルシステムを使用
FaviconHandler
および ErrorHandler
で create メソッドが更新されました。Create メソッドで Vertx
インスタンスオブジェクトを渡す必要があります。これらのメソッドはファイルシステムにアクセスします。Vertx オブジェクトを渡すと
、'Vertx' ファイルシステムを使用するファイルへのアクセスの一貫性が確保されます。
以下の例は、Eclipse Vert.x 3.x リリースで create メソッドを使用する方法を示しています。
FaviconHandler.create(); ErrorHandler.create();
以下の例は、Eclipse Vert.x 4 で create メソッドを使用する方法を示しています。
FaviconHandler.create(vertx); ErrorHandler.create(vertx);
4.12.4. テンプレートエンジンへのアクセス
Method TemplateEngine.unwrap()
を使用してテンプレートエンジンにアクセスします。その後、カスタマイズおよび設定をテンプレートに適用できます。
エンジン設定の取得および設定に使用される以下のメソッドは非推奨になりました。代わりに the TemplateEngine.unwrap()
メソッドを使用します。
-
HandlebarsTemplateEngine.getHandlebars()
-
HandlebarsTemplateEngine.getResolvers()
-
HandlebarsTemplateEngine.setResolvers()
-
JadeTemplateEngine.getJadeConfiguration()
-
ThymeleafTemplateEngine.getThymeleafTemplateEngine()
-
ThymeleafTemplateEngine.setMode()
4.12.5. ロケールインターフェースを削除
Io .vertx.ext.web.Locale
インターフェースが削除されました。代わりに io.vertx.ext.web.LanguageHeader
インターフェースを使用してください。
4.12.6. 使用できるロケールメソッドを削除
RoutingContext.acceptableLocales()
メソッドが削除されました。代わりに RoutingContext.acceptableLanguages()
メソッドを使用してください。
4.12.7. サブルーターをマウントする方法を更新
以前のリリースの Eclipse Vert.x では、Router .mountSubRouter()
メソッドが Router
を誤って返していました。これは修正され、メソッドが Route
を返すようになりました。
4.12.8. JWT 認証処理の除外文字列を使用して create メソッドを削除
JWTAuthHandler.create(JWTAuth authProvider, String skip)
メソッドが削除されました。代わりに JWTAuthHandler.create(JWTAuth authProvider)
メソッドを使用します。
以下の例は、Eclipse Vert.x 3.x リリースで JWT 認証ハンドラーが作成された方法を表しています。
router // protect everything but "/excluded/path" .route().handler(JWTAuthHandler(jwtAuth, "/excluded/path")
以下の例は、Eclipse Vert.x 4 で JWT 認証ハンドラーが作成された方法を表しています。
router .route("/excluded/path").handler(/* public access to "/excluded/path" */) // protect everything .route().handler(JWTAuthHandler(jwtAuth)
4.12.9. OSGi 環境で使用される create ハンドラーメソッドが削除
Eclipse Vert.x 4 では、OSGi 環境はサポートされなくなりました。StaticHandler.create(String, ClassLoader)
メソッドは OSGi 環境で使用されたため、削除されました。
アプリケーションでこの方法を使用した場合は、Eclipse Vert.x 4 でリソースをアプリケーションクラスパスに追加するか、ファイルシステムからリソースを提供できます。
4.12.10. ブリッジオプションクラスを削除
Sockjs.BridgeOptions
クラスが削除されました。代わりに新しい sockjs.SockJSBridgeOptions
クラスを使用してください。Sockjs.SockJSBridgeOptions
クラスには、イベントバスブリッジの設定に必要なすべてのオプションが含まれます。
データオブジェクトクラスの名前が変更された場合を除き、新しいクラスの動作は変更されません。
以前のリリースでは、sock js.BridgeOptions
クラスを使用して新規ブリッジを追加すると、多くの重複した設定がありました。新しいクラスには可能な共通設定がすべて含まれ、重複した設定を削除します。
4.12.11. Sockjs ソケットイベントバスが、デフォルトでクラスターイベントを登録しない
SockJSSocket
は、デフォルトでクラスター化されたイベントバスコンシューマーを登録しなくなりました。イベントバスを使用してソケットに書き込む場合は、Sonck JSHandlerOptions
で writeHandler
を有効にする必要があります。WriteHandler
を有効にすると、イベントバスコンシューマーはデフォルトでローカルに設定されます。
Router router = Router.router(vertx); SockJSHandlerOptions options = new SockJSHandlerOptions() .setRegisterWriteHandler(true); // enable the event bus consumer registration SockJSHandler sockJSHandler = SockJSHandler.create(vertx, options); router.mountSubRouter("/myapp", sockJSHandler.socketHandler(sockJSSocket -> { // Retrieve the writeHandlerID and store it (For example, in a local map) String writeHandlerID = sockJSSocket.writeHandlerID(); }));
イベントバスコンシューマーをクラスターに設定できます。
SockJSHandlerOptions options = new SockJSHandlerOptions() .setRegisterWriteHandler(true) // enable the event bus consumer registration .setLocalWriteHandler(false) // register a clustered event bus consumer
4.12.12. 認証プロバイダーを追加する新しい方法
SessionHandler.setAuthProvider(AuthProvider)
メソッドが非推奨になりました。代わりに SessionHandler.addAuthProvider()
メソッドを使用してください。新しいメソッドにより、アプリケーションは複数の認証プロバイダーと連携でき、セッションオブジェクトをこれらの認証プロバイダーにリンクできます。
4.12.13. OAuth2 認証プロバイダーの作成メソッドにはコンストラクター引数として vertx
が必要
Eclipse Vert.x 4 以降、OAuth2Auth.create(Vertx vertx)
メソッドには、コンストラクター引数として vertx
が必要です。Vertx
引数は、安全な非ブロッキングの乱数ジェネレーターを使用して nonce を生成するため、アプリケーションのセキュリティーが向上します。
4.13. Eclipse Vert.x Web GraphQL の変更点
以下のセクションでは、Eclipse Vert.x Web GraphQL の変更点を説明します。
Eclipse Vert.x Web GraphQL はテクノロジープレビューとしてのみ提供されます。テクノロジープレビュー機能は、Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビューの機能は、最新の技術をいち早く提供して、開発段階で機能のテストやフィードバックの収集を可能にするために提供されます。
テクノロジープレビュー機能のサポート範囲については、Red Hat カスタマーポータルの「テクノロジープレビュー機能のサポート範囲」を参照してください。
4.13.1. 複数の言語(polyglot)環境でサポートされる更新メソッド
以下のメソッドが更新され、polyglot 環境でサポートされるようになりました。* UploadScalar
がファクトリーとなりました。代わりに UploadScalar.create()
メソッドを使用してください。
-
VertxBatchLoader
がファクトリーとなりました。代わりにio.vertx.ext.web.handler.graphql.dataloader.VertxBatchLoader.create()
メソッドを使用してください。 -
VertxDataFetcher
がファクトリーとなりました。代わりにio.vertx.ext.web.handler.graphql.schema.VertxDataFetcher.create()
メソッドを使用してください。 -
VertxPropertyDataFetcher
がファクトリーとなりました。代わりにio.vertx.ext.web.handler.graphql.schema.VertxPropertyDataFetcher.create()
メソッドを使用してください。
4.13.2. Eclipse Vert.x Web GraphQL での POST 要求の処理
本リリース以前は、Eclipse Vert.x Web GraphQL ハンドラーが独自の POST 要求を処理する可能性がありました。要求を処理するのに Eclipse Vert.x Web BodyHandler
は必要ありませんでした。ただし、この実装は DDoS 攻撃の影響を受けやすくなりました。
Eclipse Vert.x 4 以降では、POST requests BodyHandler
を処理する必要があります。Eclipse Vert.x Web GraphQL ハンドラーをインストールする前に、BodyHandler
をインストールする必要があります。
4.14. Micrometer メトリクスの変更
以下のセクションでは、Micrometer メトリクスの変更点を説明します。
4.14.1. TCP の送受信バイト数は、同等の HTTP 要求および応答サマリーを持つカウンターとして記録されます。
本リリース以前は、以下のメトリクスはソケットのディストリビューションサマリーとして記録されていました。Eclipse Vert.x 4 以降では、これらのメトリクスはカウンターとしてログに記録され、交換されたデータ量を報告します。
Net クライアント
-
vertx_net_client_bytes_read
-
vertx_net_client_bytes_written
-
Net サーバー
-
vertx_net_server_bytes_read
-
vertx_net_server_bytes_written
-
これらのカウンターでは、HTTP 用に同等のディストリビューションサマリーが導入されました。これらのサマリーは、要求および応答のサイズに関する情報を収集するために使用されます。
HTTP クライアント
-
vertx_http_client_request_bytes
-
vertx_http_client_response_bytes
-
HTTP サーバー
-
vertx_http_server_request_bytes
-
vertx_http_server_response_bytes
-
4.14.2. メトリクスの名前変更
以下のメトリクスの名前が変更されました。
旧メトリクス名 | 新しいメトリクス名 | コンポーネントの更新 |
---|---|---|
|
| Net クライアントおよびサーバー HTTP クライアントおよびサーバー |
|
| Datagram Net クライアントおよびサーバー HTTP クライアントおよびサーバー |
|
| Datagram Net クライアントおよびサーバー HTTP クライアントおよびサーバー |
|
| HTTP クライアント HTTP サーバー |
|
| HTTP クライアント HTTP サーバー |
|
| HTTP クライアント HTTP サーバー |
|
| HTTP クライアント HTTP サーバー |
|
| HTTP クライアント HTTP サーバー |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
4.15. Eclipse Vert.x OpenAPI の変更点
Eclipse Vert.x 4 では、新しいモジュール vertx-web-openapi
が利用できるようになりました。このモジュールは vertx-web と併用して
、コントラクト駆動型アプリケーションを開発します。
新しいモジュールは、Eclipse Vert.x Web Router
と適切に機能します。新しいモジュールには以下の Eclipse Vert.x 依存関係が必要です。
-
vertx-json-schema
-
vertx-web-validation
新しいモジュールは、io .vertx.ext.web.openapi
パッケージで利用できます。
Eclipse Vert.x 4 では、新しいモジュールへの移行を容易にするために、古い OpenAPI モジュール vertx-web-api-contract
がサポートされます。新しい機能を活用するには、新しいモジュール vertx-web-openapi
に移行することが推奨されます。
4.15.1. 新規モジュールはルータービルダーを使用
Vertx -web-openapi
モジュールは RouterBuilder
を使用して Eclipse Vert.x Web ルーターをビルドします。このルータービルダーは、vertx- web-api-contract
モジュールのルータービルダー OpenAPI3RouterFactory
と似ています。
Vertx -web-openapi
モジュールの使用を開始するには、RouterBuilder
をインスタンス化します。
RouterBuilder.create(vertx, "petstore.yaml").onComplete(ar -> { if (ar.succeeded()) { // Spec loaded with success RouterBuilder routerBuilder = ar.result(); } else { // Something went wrong during router builder initialization Throwable exception = ar.cause(); } });
Future を使用して RouterBuilder
をインスタンス化することもできます。
RouterBuilder.create(vertx, "petstore.yaml") .onSuccess(routerBuilder -> { // Spec loaded with success }) .onFailure(exception -> { // Something went wrong during router builder initialization });
Vertx -web-openapi
モジュールは、Eclipse Vert.x ファイルシステム API を使用してファイルを読み込みます。そのため、クラスパスリソースに /
を指定する必要はありません。たとえば、アプリケーションに petstore.yaml
を指定できます。RouterBuilder
は、クラスパスリソースからコントラクトを特定できます。
4.15.2. 新規ルータービルダーメソッド
ほとんどの場合、古い OpenAPI3RouterFactory メソッド
を検索して、新しい RouterBuilder
メソッドに置き換えることができます。以下の表は、旧式のメソッドと新しいメソッドの例をいくつか紹介します。
古い OpenAPI3RouterFactory メソッド | 新しい RouterBuilder メソッド |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
以下の構文を使用して、解析された要求パラメーターにアクセスします。
RequestParameters parameters = routingContext.get(io.vertx.ext.web.validation.ValidationHandler.REQUEST_CONTEXT_KEY); int aParam = parameters.queryParameter("aParam").getInteger();
4.15.3. セキュリティーの処理
Eclipse Vert.x 4 では、methodRouterFactory.addSecurityHandler()
および OpenAPI3RouterFactory.addSecuritySchemaScopeValidator()
が利用できなくなりました。
代わりに RouterBuilder.securityHandler()
メソッドを使用します。このメソッドは、io .vertx.ext.web.handler.AuthenticationHandler
をハンドラーとして受け入れます。このメソッドは OAuth2Handler
を自動的に認識し、セキュリティースキーマを設定します。
新しいセキュリティーハンドラーは、OpenAPI 仕様 で定義された操作も実装します。
4.15.4. 一般的な障害の処理
Vertx -web-openapi
モジュールでは、以下の失敗ハンドラーは利用できません。Router.errorHandler(int, Handler)
メソッドを使用して失敗ハンドラーを設定する必要があります。
'vertx-web-api-contract' モジュールの旧メソッド | Vertx -web-openapi モジュールの新しいメソッド |
---|---|
|
|
|
|
4.15.5. OpenAPI 契約モデルへのアクセス
Eclipse Vert.x 4 では、OpenAPI コントラクトは、平文古い Java オブジェクト(POJO)にマップされません。そのため、追加の swagger-parser 依存関係は不要になりました。ゲッターおよびリゾルバーを使用して、コントラクトの特定のコンポーネントを取得できます。
以下の例は、1 つの操作を使用して特定のコンポーネントを取得する方法を示しています。
JsonObject model = routerBuilder.operation("getPets").getOperationModel();
以下の例は、完全なコントラクトを取得する方法を示しています。
JsonObject contract = routerBuilder.getOpenAPI().getOpenAPI();
以下の例は、コントラクトの一部を解決する方法を示しています。
JsonObject petModel = routerBuilder.getOpenAPI().getCached(JsonPointer.from("/components/schemas/Pet"));
4.15.6. OpenAPI を使用しない Web 要求の検証
Vertx -web-api-contract
モジュールでは、HTTP RequestValidationHandler を使用して HTTP
リクエストを検証できます。検証に OpenAPI を使用する必要はありません。
Eclipse Vert.x 4 では、HTTP 要求を検証するには vertx-web-validation
モジュールを使用します。このモジュールをインポートし、OpenAPI を使用せずにリクエストを検証できます。ValidationHandler
を使用して要求を検証します。
4.15.7. Eclipse Vert.x Web API サービスの更新
Vertx -web-api-service
モジュールが更新され、vertx -web-validation
モジュールとともに使用できるようになりました。Vertx -web-openapi
モジュールを使用している場合、Web サービス機能は変更されません。
ただし、OpenAPI を使用しない場合は、vertx -web-validation
モジュールで Web サービスモジュールを使用するには、RouteToEBServiceHandler
クラスを使用する必要があります。
router.get("/api/transactions") .handler( ValidationHandlerBuilder.create(schemaParser) .queryParameter(optionalParam("from", stringSchema())) .queryParameter(optionalParam("to", stringSchema())) .build() ).handler( RouteToEBServiceHandler.build(eventBus, "transactions.myapplication", "getTransactionsList") );
Vertx -web-api-service
モジュールは vertx-web-api-contract
をサポートしません。そのため、Eclipse Vert.x 4 にアップグレードする場合は、Eclipse Vert.x OpenAPI アプリケーションを vertx-web-openapi
モジュールに移行する必要があります。
第5章 マイクロサービスパターンの変更
本セクションでは、マイクロサービスパターンの変更点を説明します。
5.1. Eclipse Vert.x サーキットブレーカーの変更点
以下のセクションでは、Eclipse Vert.x サーキットブレーカーの変更点を説明します。
5.1.1. サーキットブレーカーで実行コマンドメソッドを削除
以下のメソッドは future で使用できないため、CircuitBreaker クラス
から削除されました。
削除されたメソッド | 置き換えメソッド |
---|---|
|
|
|
|
5.2. Eclipse Vert.x サービス検出の変更点
以下のセクションでは、Eclipse Vert.x サービス検出の変更点を説明します。
5.2.1. Contain ServiceDiscovery
引数が含まれるサービス検出から create メソッドを削除
Handler<AmqpMessage> を引数として
持つサービス検出で、以下の作成メソッドが削除されました。Future では、これらのメソッドは使用できません。
削除されたメソッド | 置き換えメソッド |
---|---|
|
|
|
|
5.2.2. サービスインポーターメソッドおよびエクスポーターメソッドが fluent でなくなる
The ServiceDiscovery.registerServiceImporter()
メソッドおよび ServiceDiscovery.registerServiceExporter()
メソッドは fluent ではなくなりました。メソッドは Future<AsyncResult>
を返します。
5.2.3. Kubernetes サービスインポーターが自動的に登録されなくなる
Vertx -service-discovery-bridge-kubernetes
は KubernetesServiceImporter
検出ブリッジを追加します。ブリッジは、Kubernetes または Openshift から Eclipse Vert.x サービス検出にサービスをインポートします。
Eclipse Vert.x 4 以降、このブリッジは自動的に登録されなくなりました。Maven プロジェクトのクラスパスにブリッジを追加しても、自動的に登録されません。
ServiceDiscovery
インスタンスの作成後にブリッジを手動で登録する必要があります。
以下の例では、ブリッジを手動で登録する方法を説明します。
JsonObject defaultConf = new JsonObject(); serviceDiscovery.registerServiceImporter(new KubernetesServiceImporter(), defaultConf);
第6章 Eclipse Vert.x 認証および承認の変更点
以下のセクションでは、Eclipse Vert.x 認証および承認の変更点を説明します。
Eclipse Vert.x 認証モジュールには、Eclipse Vert.x 4 に主要な更新があります。Io .vertx.ext.auth.AuthProvider
インターフェースは、2 つの新しいインターフェースに分割されました。
io.vertx.ext.auth.authentication.AuthenticationProvider
重要認証機能はテクノロジープレビューとしてのみ提供されます。テクノロジープレビュー機能は、Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビューの機能は、最新の技術をいち早く提供して、開発段階で機能のテストやフィードバックの収集を可能にするために提供されます。
テクノロジープレビュー機能のサポート範囲については、Red Hat カスタマーポータルの「テクノロジープレビュー機能のサポート範囲」を参照してください。
-
io.vertx.ext.auth.authorization.AuthorizationProvider
この更新により、プロバイダーは認証および承認のいずれかを個別に実行できるようになりました。
6.1. 認証アプリケーションの移行
認証メカニズムは結果レベルで変更になりました。以前のリリースでは、結果はプロバイダー固有の User
オブジェクトでした。Eclipse Vert.x 4 では、結果は io.vertx.ext.auth.User
の一般的な実装になります。
以下の例は、Eclipse Vert.x 3.x リリースでユーザーが認証された方法を示しています。
JsonObject authInfo = new JsonObject() .put("username", "john") .put("password", "super$ecret"); // omitting the error handling for brevity provider.authenticate(authInfo, res -> { if (res.succeeded()) { // may require type casting for example on Oauth2 User user = res.result(); } });
以下の例は、Eclipse Vert.x 4 でユーザーを認証する方法を示しています。
JsonObject authInfo = new JsonObject() .put("username", "john") .put("password", "super$ecret"); // omitting the error handling for brevity provider.authenticate(authInfo, res -> { if (res.succeeded()) { // Never needs type casting User user = res.result(); } });
6.2. 承認アプリケーションの移行
承認は Eclipse Vert.x 4 の新機能です。以前のリリースでは、ユーザーが User
オブジェクトでタスクを実行することが許可されているかどうかを確認できました。そのため、プロバイダーはユーザーの認証と承認の両方を行います。
Eclipse Vert.x 4 では、User
オブジェクトインスタンスは特定の認証プロバイダーに関連付けられていません。そのため、異なるプロバイダーを使用してユーザーを認証および承認できます。たとえば、OAuth2 を使用してユーザーを認証し、MongoDB または SQL データベースに対して承認チェックを実行できます。
以下の例は、ユーザーが Eclipse Vert.x 3.x リリースでプリンター #1234 を使用できるかどうかをアプリケーションをチェックする方法を示しています。
// omitting the error handling for brevity user.isAuthorized("printers:printer1234", res -> { if (res.succeeded()) { boolean hasAuthority = res.result(); if (hasAuthority) { System.out.println("User can use the printer"); } else { System.out.println("User cannot use the printer"); } } });
この承認は JDBC および MongoDB で機能しました。ただし、プロバイダーは承認チェックを実行しなかったため、OAuth2 などのプロバイダーでは機能しませんでした。Eclipse Vert.x 4 以降では、異なるプロバイダーを使用してこのような承認チェックを実行できます。
// omitting the error handling for brevity provider.getAuthorizations(user, res -> { if (res.succeeded()) { if (PermissionBasedAuthorization.create("printer1234").match(user)) { System.out.println("User can use the printer"); } else { System.out.println("User cannot use the printer"); } } });
承認は、ロール、パーミッション、ロジック操作、ワイルドカード、および追加するその他の実装で確認することができます。
6.3. キー管理の変更点
Eclipse Vert.x 4 では、キーの処理に主要な更新があります。最も重要な変更は、キーの読み込み時にパブリックバッファーとプライベートバッファーの区別がないことです。
以下のクラスが更新されました。
-
jce
キーストア
の使用に使用されるio.vertx.ext.auth.KeyStoreOptions
-
対称シークレットの処理に使用される
io.vertx.ext.auth.SecretOptions
-
公開鍵の処理に使用される
io.vertx.ext.auth.PubSecKeyOptions
以下のセクションでは、キー管理の変更点を説明します。
6.3.1. シークレットオプションクラスが利用できない
SecretOptions
クラスは利用できなくなりました。代わりに new PubSecKeyOptions
クラスを使用して、暗号化キーと連携します。
以下の例は、Eclipse Vert.x 3.x リリースで SecretOptions
クラスのメソッドが使用される方法を示しています。
new SecretOptions() .setType("HS256") .setSecret("password")
以下の例は、Eclipse Vert.x 4 で PubSecKeyOptions
クラスのメソッドを使用する方法を示しています。
new PubSecKeyOptions() .setAlgorithm("HS256") .setSecretKey("password")
6.3.2. 公開鍵管理での更新
Eclipse Vert.x 3.x では、公開秘密鍵管理の設定オブジェクトは以下を前提としています。
- 鍵はキーペアとして設定します。
- キーデータは、標準の区切り文字なしで PKCS8 でエンコードされた文字列です。
以下の例は、Eclipse Vert.x 3.x でキーペアを設定する方法を示しています。
new PubSecKeyOptions() .setPublicKey( // remove the PEM boundaries pubPemString .replaceAll("-----BEGIN PUBLIC KEY----") .replaceAll("-----END PUBLIC KEY----")) .setSecretKey( // remove the PEM boundaries secPemString .replaceAll("-----BEGIN PUBLIC KEY----") .replaceAll("-----END PUBLIC KEY----"));
Eclipse Vert.x 4 では、公開鍵と秘密鍵の両方を指定する必要があります。
以下の例は、Eclipse Vert.x 4 でキーペアを設定する方法を示しています。
PubSecKeyOptions pubKey = new PubSecKeyOptions() // the buffer is the exact contents of the PEM file and had boundaries included in it .setBuffer(pubPemString); PubSecKeyOptions secKey = new PubSecKeyOptions() // the buffer is the exact contents of the PEM file and had boundaries included in it .setBuffer(secPemString);
PubSecKeyOptions
を使用して X509 証明書に対応できるようになりました。
PubSecKeyOptions x509Certificate = new PubSecKeyOptions() // the buffer is the exact contents of the PEM file and had boundaries included in it .setBuffer(x509PemString);
6.3.3. キーストア管理の変更点
Eclipse Vert.x 3.x では、KeyStore Options
はキーストアの形式が jceks
であると仮定し、保存されたパスワードはキーのパスワードと同じであることを前提としています。Jceks
はプロプライエタリー形式であるため、代わりに JDK などの標準形式を使用することが推奨されます。
Eclipse Vert.x 4 で KeyStoreOptions
を使用する場合は、ストアタイプを指定できます。たとえば、PKCS11 や PKCS12 などのストアタイプを設定できます。デフォルトのストアタイプは jceks
です。
Eclipse Vert.x 3.x では、すべてのキーストアエントリーが同じパスワード(キーストアパスワード)を共有します。Eclipse Vert.x 4 では、各キーストアエントリーに専用のパスワードを指定できます。各キーストアエントリーにパスワードを設定しない場合は、キーストアパスワードをすべてのエントリーのデフォルトパスワードとして設定できます。
以下の例は、Eclipse Vert.x 3.x で jceks
キーストアを読み込む方法を示しています。
new KeyStoreOptions() .setPath("path/to/keystore.jks") .setPassword("keystore-password");
Eclipse Vert.x 4 では、デフォルトの形式は JDK によって設定されるデフォルトの形式であることを前提としています。形式は、Java 9 以降の PKCS12
です。
以下の例は、Eclipse Vert.x 4 で jceks
キーストアを読み込む方法を示しています。
new KeyStoreOptions() .setPath("path/to/keystore.jks") // Modern JDKs use `jceks` keystore. But this type is not the default // If the type is not set to `jceks` then probably `pkcs12` will be used .setType("jceks") .setPassword("keystore-password") // optionally if your keys have different passwords // and if a key specific id is not provided it defaults to // the keystore password .putPasswordProtection("key-id", "key-specific-password");
6.4. 非推奨になった、および削除された認証および承認のメソッド
以下のセクションでは、認証および承認のために非推奨となったメソッドおよび削除されたメソッドを示します。
6.4.1. 削除された認証メソッドおよび承認メソッドの一覧
以下のメソッドが削除されました。
削除されたメソッド | 置き換えメソッド |
---|---|
|
|
|
|
|
|
|
|
| 置き換えるメソッドなし |
|
|
|
|
| 置き換えるメソッドなし |
| 置き換えるメソッドなし |
6.4.2. 非推奨の認証および承認のメソッドの一覧
以下のメソッドが非推奨になりました。
非推奨となったメソッド | 置き換えメソッド |
---|---|
|
|
|
|
| 置き換えるメソッドなし |
|
|
| 置き換えるメソッドなし |
6.4.3. 非推奨の認証および承認クラスの一覧
以下のクラスが非推奨になりました。
非推奨のクラス | 置き換えクラス |
---|---|
| 'User.create(JsonObject)' メソッドを使用してユーザーオブジェクトを作成します。 |
| 置き換えクラスなし |
|
認証用 |
| 置き換えクラスなし |
|
|
|
|
| 置き換えクラスなし |
第7章 プロトコルの変更点
本セクションでは、ネットワークプロトコルの変更点を説明します。
7.1. Eclipse Vert.x gRPC の変更点
以下のセクションでは、Eclipse Vert.x gRPC の変更点を説明します。
7.1.1. 新しい gRPC コンパイラープラグイン
Eclipse Vert.x 4 では、protoc-gen-grpc-java
モジュールは利用できなくなりました。このモジュールは、公式の gRPC コンパイラーのフォークです。以前のリリースの Eclipse Vert.x では、このフォークを使用して作業する必要がありました。このフォークは Eclipse プロジェクトにより維持されます。フォークの使用は複雑です。
以前のリリースでは、gRPC を使用するために、以下の情報が pom.xml
ファイルに追加されていました。
<!-- Vert.x 3.x --> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <configuration> <protocArtifact>com.google.protobuf:protoc:3.2.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <!-- NOTE: the gav coordinates point to the 3.x only compiler fork --> <pluginArtifact>io.vertx:protoc-gen-grpc-java:${vertx.grpc.version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> ... </plugin>
Eclipse Vert.x 4 では、新しい gRPC コンパイラープラグインが利用できるようになりました。このプラグインは、フォークの代わりに公式の gRPC コンパイラーを使用します。新しい gRPC プラグインを使用するには、以下の情報を pom.xml
ファイルに追加します。
<!-- Vert.x 4.x --> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <configuration> <protocArtifact>com.google.protobuf:protoc:3.2.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <!-- NOTE: the gav coordinates point to the official compiler --> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${vertx.grpc.version}:exe:${os.detected.classifier}</pluginArtifact> <protocPlugins> <!-- NEW: a plugin is added to generate the Vert.x specific code --> <protocPlugin> <id>vertx-grpc-protoc-plugin</id> <groupId>io.vertx</groupId> <artifactId>vertx-grpc-protoc-plugin</artifactId> <version>${vertx.version}</version> <mainClass>io.vertx.grpc.protoc.plugin.VertxGrpcGenerator</mainClass> </protocPlugin> </protocPlugins> </configuration> ... </plugin>
7.1.2. 生成されたコードの移行
Eclipse Vert.x 4 では、新しいコンパイラーが使用されます。新規の gRPC プラグインが使用されると、生成されたコードは同じソースファイルに書き込まれません。これは、コンパイラーがベースクラスでのカスタムコード生成を許可しないためです。コードを保存するには、プラグインが別の名前で新しいクラスを生成する必要があります。
以前のリリースの Eclipse Vert.x では、古い gRPC プラグインが同じソースファイルに生成されたコードを書き込みました。
たとえば、以下の記述子があるとします。
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} }
Eclipse Vert.x 3.x では、コードは GreeterGrpc
クラスに生成されます。
// 3.x GreeterGrpc.GreeterVertxImplBase service = new GreeterGrpc.GreeterVertxImplBase() { ... }
Eclipse Vert.x 4 では、コードは VertxGreeterGrpc
クラスに生成されます。
// 4.x VertxGreeterGrpc.GreeterVertxImplBase service = new VertxGreeterGrpc.GreeterVertxImplBase() { ... }
7.1.3. gRPC API による future のサポート
Eclipse Vert.x 4 では、gRPC API は future をサポートします。GRPC プラグインはプロミスキャス化された API を生成します。これらの API は標準の Eclipse Vert.x の入力引数および出力引数を使用するため、標準の Eclipse Vert.x アプリケーションの作成が容易になります。
以下の例は、Eclipse Vert.x 3.x での promise の使用例を示しています。
// 3.x GreeterGrpc.GreeterVertxImplBase service = new GreeterGrpc.GreeterVertxImplBase() { @Override public void sayHello(HelloRequest request, Promise<HelloReply> future) { future.complete( HelloReply.newBuilder().setMessage(request.getName()).build()); } }
以下の例は、Eclipse Vert.x 4 での future の使用を示しています。
// 4.x VertxGreeterGrpc.GreeterVertxImplBase service = new VertxGreeterGrpc.GreeterVertxImplBase() { @Override public Future<HelloReply> sayHello(HelloRequest request) { return Future.succeededFuture( HelloReply.newBuilder() .setMessage(request.getName()) .build()); } }
7.2. Eclipse Vert.x MQTT の変更点
以下のセクションでは、Eclipse Vert.x MQTT の変更点を説明します。
7.2.1. MQTT クライアントの一部の fluent メソッドが future を返す
MqttClient
クラスの fluent メソッドの一部は、fluent ではなく Future
を返します。たとえば、MqttClient. connect()、MqttClient.disconnect()
、MqttClient.
などのメソッドは、Eclipse Vert.x 4 の future を返します。
publish()
以下の例は、Eclipse Vert.x 3.x リリースでの publish()
メソッドの使用を示しています。
client .publish("hello", Buffer.buffer("hello"), MqttQoS.EXACTLY_ONCE, false, false) .publish("hello", Buffer.buffer("hello"), MqttQoS.AT_LEAST_ONCE, false, false);
以下の例は、Eclipse Vert.x 4 リリースでの publish()
メソッドの使用を示しています。
client.publish("hello", Buffer.buffer("hello"), MqttQoS.EXACTLY_ONCE, false, false); client.publish("hello", Buffer.buffer("hello"), MqttQoS.AT_LEAST_ONCE, false, false);
7.2.2. MqttWill
メッセージはバッファーを返す
MqttWill
データオブジェクトは、文字列メッセージをバイトアレイではなく Eclipse Vert.x バッファーとしてラップします。
7.2.3. MQTT から非推奨の MqttWill
および承認メソッドを削除
以下の MQTT メソッドが削除されました。
削除されたメソッド | 置き換えメソッド |
|
|
|
|
|
|
|
|
|
|
|
|
7.3. Eclipse Vert.x サービスプロキシーの変更点
以下のセクションでは、サービスプロキシーの変更点を説明します。
7.3.1. サービスプロキシーコードジェネレーターの使用
ServiceProxyProcessor
クラスが削除されました。
サービスプロキシーコードジェネレーターを使用するには、クラスパスのプロセッサー分類 子で vertx-codegen
をインポートする必要があります。
<dependencies> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-codegen</artifactId> <classifier>processor</classifier> </dependency> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-service-proxy</artifactId> </dependency> </dependencies>
サービスプロキシーは vertx-codegen から
。
io.vertx.codegen.CodeGenProcessor
を再利用して、サービスプロキシーおよびハンドラーのコード生成を開始します
第8章 クライアントコンポーネントの変更
本セクションでは、Eclipse Vert.x クライアントの変更点を説明します。
8.1. Eclipse Vert.x Kafka クライアントの変更点
以下のセクションでは、Eclipse Vert.x Kafka クライアントの変更点を説明します。
8.1.1. AdminUtils クラスが利用できなくなる
AdminUtils
クラスが利用できなくなりました。代わりに新しい KafkaAdminClient
クラスを使用して、Kafka クラスターで管理操作を実行します。
8.1.2. Flush メソッドは非同期ハンドラーを使用
KafkaProducer
クラスのフラッシュメソッドは、Handler<AsyncResult> の代わりに
を使用します。
Handler<AsyncResult<AsyncResult>&
gt;
8.2. Eclipse Vert.x JDBC クライアントの変更点
Eclipse Vert.x 4 以降、JDBC クライアントは SQL クライアントをサポートします。SQL 共通モジュールは、io.vertx:vertx- jdbc-client モジュールにマージされる
の JDBC クライアントでマージされました。Io io.vertx:vertx-sql-
common.vertx:vertx-
依存関係ファイルを削除する必要があります。SQL 共通クライアントのマージにより、すべてのデータベース API が JDBC クライアントに統合されました。
jdbc-client にはそれが含まれるため、io.vertx:vertx-sql-
common
Eclipse Vert.x 4 では、SQL クライアントが更新され、以下のクライアントが含まれるようになりました。
- リアクティブ PostgreSQL クライアント。以前のリリースでは、リアクティブ PostgreSQL クライアントが含まれていました。
- リアクティブ MySQL クライアント
- リアクティブ DB2 クライアント
- リアクティブ PostgreSQL クライアントを継続して組み込みます。このクライアントは Eclipse Vert.x 3.x リリースでも利用できました。
- 既存の JDBC クライアントに JDBC クライアント API と SQL クライアント API の両方が含まれるようになりました。
リアクティブ実装では、データベースネットワークプロトコルを使用します。これにより、リソース効率が向上します。
データベースへの JDBC 呼び出しはブロック呼び出しです。JDBC クライアントはワーカースレッドを使用してこれらの呼び出しをブロックしません。
以下のセクションでは、Eclipse Vert.x JDBC クライアントの変更点を説明します。
8.2.1. プールの作成
Eclipse Vert.x 4 では、JDBC クライアント API を使用してプールを作成できます。以前のリリースでは、クライアントのみを作成できました。プールを作成できませんでした。
以下の例は、Eclipse Vert.x 3.x でクライアントを作成する方法を示しています。
// 3.x SQLClient client = JDBCClient.create(vertx, jsonConfig);
以下の例は、Eclipse Vert.x 4 でプールを作成する方法を示しています。
// 4.x JDBCPool pool = JDBCPool.pool(vertx, jsonConfig);
Eclipse Vert.x 3.x API は Eclipse Vert.x 4 でサポートされていますが、アプリケーションで新しい JDBC クライアント API を使用することが推奨されます。
プールを使用すると、単純なクエリーを実行できます。単純なクエリーの接続を管理する必要はありません。ただし、複雑なクエリーや複数のクエリーの場合は、接続を管理する必要があります。
以下の例は、Eclipse Vert.x 3.x でクエリーの接続を管理する方法を示しています。
// 3.x client.getConnection(res -> { if (res.succeeded()) { SQLConnection connection = res.result(); // Important, do not forget to return the connection connection.close(); } else { // Failed to get connection } });
以下の例は、Eclipse Vert.x 4 でクエリーの接続を管理する方法を示しています。
// 4.x pool .getConnection() .onFailure(e -> { // Failed to get a connection }) .onSuccess(conn -> { // Important, do not forget to return the connection conn.close(); });
8.2.2. Typsesafe 設定のサポート
設定には jsonConfig
を使用できます。ただし、jsonConfig
を使用するとエラーが発生する可能性があります。これらのエラーを回避するには、JDBC クライアントでは Typesafe Config が導入されました。
以下の例は、Typesafe Config の基本構造を示しています。
// 4.x ONLY!!! JDBCPool pool = JDBCPool.pool( vertx, // configure the connection new JDBCConnectOptions() // H2 connection string .setJdbcUrl("jdbc:h2:~/test") // username .setUser("sa") // password .setPassword(""), // configure the pool new PoolOptions() .setMaxSize(16) );
Typesafe Config を使用するには、プロジェクトに agroal
接続プールを含める必要があります。プールは多くの設定オプションを公開しないため、設定を簡単に使用できます。
8.2.3. SQL クエリーの実行
ここでは、JDBC クライアントでクエリーを実行する方法を説明します。
8.2.3.1. 単発のクエリーの実行
以下の例は、Eclipse Vert.x 3.x で接続を管理せずにクエリーを実行する方法を示しています。
// 3.x client.query("SELECT * FROM user WHERE emp_id > ?", new JsonArray().add(1000), res -> { if (res.succeeded()) { ResultSet rs = res2.result(); // You can use these results in your application } });
以下の例は、Eclipse Vert.x 4 で接続を管理せずにクエリーを実行する方法を示しています。
// 4.x pool .preparedQuery("SELECT * FROM user WHERE emp_id > ?") // the emp id to look up .execute(Tuple.of(1000)) .onSuccess(rows -> { for (Row row : rows) { System.out.println(row.getString("FIRST_NAME")); } });
8.2.3.2. 管理接続でのクエリーの実行
以下の例は、Eclipse Vert.x 4 で管理された接続でクエリーを実行する方法を示しています。
pool .getConnection() .onFailure(e -> { // Failed to get a connection }) .onSuccess(conn -> { conn .query("SELECT * FROM user") .execute() .onFailure(e -> { // Handle the failure // Important, do not forget to return the connection conn.close(); }) .onSuccess(rows -> { for (Row row : rows) { System.out.println(row.getString("FIRST_NAME")); } // Important, do not forget to return the connection conn.close(); }); });
8.2.4. ストアドプロシージャーのサポート
ストアドプロシージャーは JDBC クライアントでサポートされます。
以下の例は、Eclipse Vert.x 3.x で IN
引数を渡す方法を示しています。
// 3.x connection.callWithParams( "{ call new_customer(?, ?) }", new JsonArray().add("John").add("Doe"), null, res -> { if (res.succeeded()) { // Success! } else { // Failed! } });
以下の例は、Eclipse Vert.x 4 で IN
引数を渡す方法を示しています。
// 4.x client .preparedQuery("{call new_customer(?, ?)}") .execute(Tuple.of("Paulo", "Lopes")) .onSuccess(rows -> { ... });
Eclipse Vert.x 3.x では、IN 引数と OUT
引数を組み合わせるサポートは、利用可能なタイプにより大幅に制限されていました。Eclipse Vert.x 4 では、プールは安全なタイプであり、IN
と
OUT 引数の組み合わせを
処理できます。アプリケーションで INOUT
パラメーターを使用することもできます。
以下の例は、Eclipse Vert.x 3.x での引数の処理を示しています。
// 3.x connection.callWithParams( "{ call customer_lastname(?, ?) }", new JsonArray().add("John"), new JsonArray().addNull().add("VARCHAR"), res -> { if (res.succeeded()) { ResultSet result = res.result(); } else { // Failed! } });
以下の例は、Eclipse Vert.x 4 での引数の処理を示しています。
// 4.x client .preparedQuery("{call customer_lastname(?, ?)}") .execute(Tuple.of("John", SqlOutParam.OUT(JDBCType.VARCHAR))) .onSuccess(rows -> { ... });
JDBC クライアントで、データタイプが更新されました。
-
OUT
型の引数に、戻り値のタイプを指定できます。この例では、OUT
引数は、JDBC 定数であるVARCHAR
型として指定されます。 - タイプは JSON の制限によってバインドされません。タイプ名のテキスト定数の代わりに、データベース固有の型を使用できるようになりました。
8.3. Eclipse Vert.x メールクライアントの変更点
以下のセクションでは、Eclipse Vert.x メールクライアントの変更点を説明します。
8.3.1. MailAttachment
がインターフェースとして利用可能
Eclipse Vert.x 4 以降では、MailAttachment
はインターフェースとして利用できます。これにより、ストリームでメール添付機能を使用できます。以前のリリースの Eclipse Vert.x では、MailAttachment
はクラスとして利用でき、メールの添付ファイルはデータオブジェクトとして表されていました。
8.3.2. メール設定インターフェースが net クライアントオプションを拡張します。
MailConfig
インターフェースは NetClientOptions
インターフェースを拡張します。この拡張機能により、メール設定は NetClient
のプロキシー設定もサポートします。
8.4. Eclipse Vert.x AMQP クライアントの変更点
以下のセクションでは、Eclipse Vert.x AMQP クライアントの変更点を説明します。
8.4.1. AMQP クライアントのメソッドに AmqpMessage
引数が含まれる
Handler<AmqpMessage> を引数として持つ
AMQP クライアントメソッドが削除されました。以前のリリースでは、このハンドラーを ReadStream<AmqpMessage>
に設定できました。ただし、アプリケーションを移行して future を使用する場合、このような方法は使用できません。
削除されたメソッド | 置き換えメソッド |
|
|
|
|
|
|
8.5. Eclipse Vert.x MongoDB クライアントの変更点
以下のセクションでは、Eclipse Vert.x MongoDB クライアントの変更点を説明します。
8.5.1. MongoDB クライアントから削除されたメソッド
以下のメソッドは MongoClient
クラスから削除されました。
削除されたメソッド | 置き換えメソッド |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8.6. EventBus JavaScript クライアントの変更点
Eclipse Vert.x 4 では、EventBus JavaScript クライアントモジュールが新しい場所で利用できます。新しい場所からモジュールを使用するようにビルドシステムを更新する必要があります。
Eclipse Vert.x 3.x では、イベントバス JavaScript クライアントはさまざまな場所で利用できました。以下に例を示します。
Eclipse Vert.x 4 では、JavaScript クライアントは npm でのみ利用できます。EventBus JavaScript クライアントモジュールは、以下の場所からアクセスできます。
8.6.1. JavaScript クライアントのバージョン管理
Eclipse Vert.x 4 より前は、すべての Eclipse Vert.x リリースに JavaScript クライアントの新しいリリースが含まれていました。
ただし、Eclipse Vert.x 4 以降では、クライアントに変更がある場合に限り、新しいバージョンの JavaScript クライアントを npm で利用できます。バージョンの変更がない限り、すべての Eclipse Vert.x リリースでクライアントアプリケーションを更新する必要はありません。
8.7. Eclipse Vert.x Redis クライアントの変更点
Eclipse Vert.x 4 では、Redis クラスを使用して Redis
クライアントと連携します。RedisClient
クラスは利用できなくなりました。
- 注記
-
アプリケーションを
RedisClient クラスから Redis
クラスに移行するのに役立つため、ヘルパークラス
RedisAPI
が利用可能です。RedisAPI
により、RedisClient
クラスと同様の機能を複製できます。
新しいクラスには、プロトコルおよび Redis サーバー機能の機能強化がすべて含まれます。新しいクラスを使用して以下を行います。
- すべての Redis コマンドとの連携
- 単一サーバーへの接続
- Redis Sentinel が有効になっている高可用性サーバーに接続
- Redis のクラスター設定への接続
- Redis 拡張機能での要求の実行
- RESP2 および RESP3 サーバープロトコルサーバーの両方と通信
8.7.1. 既存の Redis クライアントアプリケーションから新規クライアントへの移行
既存のアプリケーションを新しい Redis
クライアントに直接移行するか、またはヘルパークラス RedisAPI
を使用して 2 つの手順でアプリケーションを移行できます。
アプリケーションを移行する前に、クライアントを作成する必要があります。
8.7.1.1. クライアントの作成
以下の例は、Eclipse Vert.x 3.x リリースで Redis クライアントが作成された方法を示しています。
// Create the redis client (3.x) RedisClient client = RedisClient .create(vertx, new RedisOptions().setHost(host));
以下の例は、Eclipse Vert.x 4 で Redis クライアントを作成する方法を示しています。
// Create the redis client (4.x) Redis client = Redis .createClient( vertx, "redis://server.address:port");
Eclipse Vert.x 4 では、クライアントは以下の標準接続文字列構文を使用します。
redis[s]://[[user]:password@]server[:port]/[database]
8.7.1.2. アプリケーションの RedisAPI
への移行
「RedisAPI」を使用して、接続の管理方法を決定できるようになりました。
- クライアントがプールを使用する接続を管理できるようにします。
または
- 新しい接続を要求すると、接続を制御できます。完了したら必ず接続を閉じるか、または返す必要があります。
クライアントを作成してから、要求を処理するためにアプリケーションを更新する必要があります。
以下の例は、Eclipse Vert.x 3.x リリースでクライアントを作成した後に要求を処理する方法を示しています。
// Using 3.x // omitting the error handling for brevity client.set("key", "value", s -> { if (s.succeeded()) { System.out.println("key stored"); client.get("key", g -> { if (s.succeeded()) { System.out.println("Retrieved value: " + s.result()); } }); } });
以下の例は、Eclipse Vert.x 4 でクライアントを作成した後に要求を処理する方法を示しています。この例では、ハードコーディングオプションの代わりに、キーと値のペアを設定するリストを使用します。コマンドで使用できる引数の詳細は、「 Redis SET コマンド 」を参照してください。
// Using 4.x // omitting the error handling for brevity // 1. Wrap the client into a RedisAPI api = RedisAPI.api(client); // 2. Use the typed API api.set( Arrays.asList("key", "value"), s -> { if (s.succeeded()) { System.out.println("key stored"); client.get("key", g -> { if (s.succeeded()) { System.out.println("Retrieved value: " + s.result()); } }); } });
8.7.1.3. アプリケーションを Redis
クライアントに直接移行
新しい Redis
クライアントに直接移行する場合:
- すべての新しい Redis コマンドを使用することができます。
- 拡張機能を使用できます。
- ヘルパークラスから新しいクライアントへの変換の一部を減らすことができますが、アプリケーションのパフォーマンスが向上することがあります。
クライアントを作成してから、要求を処理するためにアプリケーションを更新する必要があります。
以下の例は、Eclipse Vert.x 3.x リリースでクライアントを作成した後に要求を設定および取得する方法を示しています。
// Using 3.x // omitting the error handling for brevity client.set("key", "value", s -> { if (s.succeeded()) { System.out.println("key stored"); client.get("key", g -> { if (s.succeeded()) { System.out.println("Retrieved value: " + s.result()); } }); } });
以下の例は、Eclipse Vert.x 4 でクライアントを作成した後に要求を処理する方法を示しています。
// Using 4.x // omitting the error handling for brevity import static io.vertx.redis.client.Request.cmd; import static io.vertx.redis.client.Command.*; client.send(cmd(SET).arg("key").arg("value"), s -> { if (s.succeeded()) { System.out.println("key stored"); client.send(cmd(GET).arg("key"), g -> { if (s.succeeded()) { System.out.println("Retrieved value: " + s.result()); } }); } });
Eclipse Vert.x 4 では、すべての対話は send(Request)
メソッドを使用します。
8.7.1.4. 応答の移行
Eclipse Vert.x 3.x では、クライアントは Redis 5 までの既知のコマンドをすべてハードコードするために使用され、応答もコマンドに従って入力されました。
新しいクライアントでは、コマンドはハードコーディングされません。応答のタイプは Response
です。新しい Wire プロトコルにはさらに多くのタイプがあります。
古いクライアントでは、応答は以下のようになります。
-
null
-
Long
-
文字列
-
JsonArray
-
JsonObject
(INFOおよび
HMGET
アレイ応答の場合)
新しいクライアントでは、応答は以下のタイプになります。
-
null
-
Response
Response
オブジェクトには型コンバーターがあります。たとえば、以下のようなコンバーターがあります。
-
toString()
-
toInteger()
-
toBoolean()
-
toBuffer()
受信したデータが要求されたタイプでない場合、型コンバーターはこれを可能な限り最も近いデータ型に変換します。特定の型への変換ができない場合は、UnsupportedOperationException
が出力されます。たとえば、String から
List
または Map
への変換はできません。
Response
オブジェクトは Iterable
インターフェースを実装するため、コレクションを処理することもできます。
以下の例は、MGET 要求の実行方法を示しています。
// Using 4.x // omitting the error handling for brevity import static io.vertx.redis.client.Request.cmd; import static io.vertx.redis.client.Command.*; client.send(cmd(MGET).arg("key1").arg("key2").arg("key3"), mget -> { mget.result() .forEach(value -> { // Use the single value
8.7.2. Eclipse Vert.x Redis クライアントの更新
本セクションでは、Redis クライアントの変更点を説明します。
8.7.2.1. Redis ロールおよびノードのオプションから非推奨の用語「slave(スレーブ)」を削除
Redis ロールおよびノードのオプションで、非推奨の「slave(スレーブ)」という用語が「replica」に置き換えられました。
- ロール
-
以下の例は、Eclipse Vert.x 3.x リリースでの
SLAVE
ロールの使用を示しています。
// Before (3.x) Redis.createClient( rule.vertx(), new RedisOptions() .setType(RedisClientType.SENTINEL) .addConnectionString("redis://localhost:5000") .setMasterName("sentinel7000") .setRole(RedisRole.SLAVE));
以下の例は、Eclipse Vert.x 4 での REPLICA
ロールの使用を示しています。
// After (4.x) Redis.createClient( rule.vertx(), new RedisOptions() .setType(RedisClientType.SENTINEL) .addConnectionString("redis://localhost:5000") .setMasterName("sentinel7000") .setRole(RedisRole.REPLICA));
- ノードのオプション
-
以下の例は、
Eclipse Vert.x 3.x リリースでのノードタイプの Redis
Slaves の使用方法を示しています。
// Before (3.9) options.setUseSlaves(RedisSlaves);
以下の例は、Eclipse Vert.x 4 でのノード型の RedisReplicas
の使用方法を示しています。
// After (4.x) options.setUseReplicas(RedisReplicas);
第9章 クラスタリングの変更点
本セクションでは、クラスタリングの変更点を説明します。
9.1. クラスター化されたフラグがオプションクラスから削除
Eclipse Vert.x アプリケーションでクラスタリングを指定、取得、および設定するのに使用されるメソッドおよびブール値が VertxOptions
クラスおよび EventBusOptions
クラスから削除されました。
9.2. Infinispan クラスターマネージャーの変更点
ここでは、Infinispan クラスターマネージャーの変更点を説明します。
9.2.1. カスタム設定の更新
Infinispan クラスターマネージャーは Infinispan 12 をベースとしています。
Eclipse Vert.x 4 では、クラスタリング SPI が再設計されました。サブスクリプションのデータモデルが変更されました。そのため、Eclipse Vert.x 3.x ノードと Eclipse Vert.x 4 ノードを同じ Infinispan クラスターに追加することはできません。
EventBus API および SharedData API が同じままであるため、Eclipse Vert.x アプリケーションはこの変更の影響を受けません。
Eclipse Vert.x 3.x アプリケーションでカスタム Infinispan 設定ファイルがある場合:
-
__vertx.subs
キャッシュタイプを Distributed ではなく Replicated に変更します。 -
レプリケートされたキャッシュ
__vertx.nodeInfo を追加します
。
<cache-container default-cache="distributed-cache"> <distributed-cache name="distributed-cache"/> <replicated-cache name="__vertx.subs"/> <replicated-cache name="__vertx.haInfo"/> <replicated-cache name="__vertx.nodeInfo"/> <distributed-cache-configuration name="__vertx.distributed.cache.configuration"/> </cache-container>
Openshift で Eclipse Vert.x クラスターを実行する場合、infinispan -cloud
JAR は不要になりました。JAR はビルドファイルの dependencies セクションから削除されます。この JAR にバンドルされた設定ファイルは infinispan-core
JAR に含まれるようになりました。
9.3. クラスターの移行
コードベースの移行ストラテジーを決定することが重要です。これは、以下の理由により、Eclipse Vert.x 3.x ノードおよび Eclipse Vert.x 4 ノードを単一のクラスターに追加できないためです。
- クラスターマネージャーのアップグレード - クラスターマネージャーのメジャーバージョンのアップグレードにより、後方互換性が回避されます。
- サブスクリプションデータの変更 - Eclipse Vert.x は、クラスターマネージャーに保存されている EventBus サブスクリプションデータの形式を変更しました。
- トランスポートプロトコルの変更 - Eclipse Vert.x は、クラスターのメッセージトランスポートプロトコルのフィールドを変更しました。
単一アプリケーションまたは密接に関連するマイクロサービスに Eclipse Vert.x クラスターがある場合は、コードベースを一度に新しいクラスターに移行できます。
ただし、一度にコードベースを移行できない場合は、本セクションの推奨事項を使用して Eclipse Vert.x 3.x コードベースを Eclipse Vert.x 4 に移行します。
9.3.1. クラスターの分割
アプリケーションごとに異なるチームが verticle をデプロイしたクラスターがある場合、Eclipse Vert.x 3.x クラスターを小規模なものに分割することを検討してください。クラスターを分割すると、分離されたコンポーネントはクラスタリング機能を使用して通信できなくなることに注意してください。以下のコンポーネントを使用してクラスターを分割できます。
- EventBus 要求および応答 - HTTP または RESTful Web サービス、gRPC
-
EventBus 送信および公開 - メッセージングシステム、Postgres
LISTEN
およびNOTIFY
、Redis Pub および Sub - 共有データ - Redis、Infinispan
クラスターの分割後に、各チームの準備が整ったら、または必要に応じて Eclipse Vert.x 4 に移行できます。
9.3.2. Eclipse Vert.x EventBus リンクの使用
クラスターを分割できない場合は、Vert.x EventBus リンク を使用してコードベースを段階的に移行します。
Vert.x EventBus Link は、Eclipse Vert.x 3.x クラスター EventBus を Eclipse Vert.x 4 クラスター EventBus に接続するツールです。
共有データ API、つまりマップ、カウンター、およびロックの移行はサポートされません。
このツールは、EventBus インターフェースを実装する
オブジェクトを作成します。EventBus
LinkEventBusLink
のインスタンスは、各クラスターの少なくとも 1 つのノードに作成されます。インスタンスは、アドレスのセットを提供し、その動作はメッセージのパラダイムによって異なります。
- fire および forget および request および reply: メッセージはリモートクラスターに送信されます。
- publish: メッセージはこのクラスターとリモートクラスターの両方に送信されます。
Eclipse Vert.x EventBus リンクは、WebSocket サーバーを作成してメッセージを受信し、WebSocket クライアントを使用してメッセージを送信します。
詳細は、「 Getting started」 および「 using 」を参照してください。
第10章 Eclipse Vert.x のその他の変更点
以下のセクションでは、Eclipse Vert.x 4 のその他の変更点を説明します。
10.1. Starter
クラスの削除
Starter
クラスは削除されました。代わりに Launcher
クラスを使用して、main()
メソッドなしで Eclipse Vert.x アプリケーションを起動します。
10.2. Java 8 の分離デプロイメント
Eclipse Vert.x 4 は Java 11 をサポートします。この Java バージョンは、分離されたクラスローディングをサポートしません。Eclipse Vert.x 4 では、Java 8 で分離されたクラスローディングがサポートされます。
10.3. Eclipse Vert.x コンテキストから hook メソッドを削除
Context.addCloseHook()
メソッドおよび Context.removeCloseHook()
メソッドは Context
クラスから削除されました。これらのメソッドは内部インターフェース InternalContext
に移動しました。
10.4. オプションから clone メソッドを削除
Methods KeyCertOptions.clone()
、TrustOptions.clone()
、および SSLEngineOptions.clone()
が削除されました。代わりに methods KeyCertOptions.copy()
、TrustOptions.copy()
、および SSLEngineOptions.copy()
を使用してください。
10.5. オプションから equals メソッドおよび hashcode メソッドを削除
VertxOptions.equals()
メソッドおよび VertxOptions.hashCode()
メソッドが削除されました。
10.6. ファイルのキャッシュを確認する新しい方法
VertxOptions.fileResolverCachingEnabled()
メソッドが削除されました。代わりに FileSystemOptions.isFileCachingEnabled()
メソッドを使用して、クラスパスを解決するのにファイルキャッシュが有効かどうかを確認します。
10.7. Service Provider Interface(SPI)メトリクス
Metrics.isEnabled()
メソッドが削除されました。Service Provider Interface(SPI)メトリクスは null オブジェクトを返し、メトリクスが有効ではないことを示します。
10.8. プールされたバッファーメソッドの削除
プールされたバッファーメソッド TCPSSLOptions.isUsePooledBuffers()
および TCPSSLOptions.setUsePooledBuffers()
が削除されました。
10.9. 共有データソースのないクライアントを作成するメソッド
以下の新しいメソッドを使用して、他のクライアントとデータソースを共有していないクライアントを作成します。これらのメソッドは、独自のデータソースを維持します。
非推奨となったメソッド | 新しいメソッド |
---|---|
|
|
|
|
|
|
|
|
10.10. Eclipse Vert.x JUnit5 の変更点
以下のセクションでは、Eclipse Vert.x JUnit5 の変更点を説明します。
10.10.1. Vertx -core
モジュールと、拡張機能の更新をサポート
Vertx -core
モジュールが更新され、パラメーターの挿入にサービスプロバイダーインターフェースが使用されるようになりました。この変更により、JUnit5 に以下の更新が行われました。
-
作成に必要なパラメーターの前に
Vertx
パラメーターを呼び出す必要があります。たとえば、WebClient を挿入する場合などです
。 -
vertx-junit5
モジュールは、vertx-core
モジュールのみをサポートします。 -
reactiverse-junit5-extensions
モジュールは、WebClient
などの追加パラメータータイプが含まれる拡張機能をホストします。 Rxjava 1 および 2 のバインディングが、vertx
-junit5-
モジュールとして利用できるようになりました。extensions リポジトリーの
java2vertx-
junit5-rx-java モジュールおよび vertx-junit5-rx-Eclipse Vert.x 4.1.0 から、RxJava 3 バインディング
vertx-junit5-rx-java3
が利用可能です。
10.10.2. Eclipse Vert.x テキストコンテキストで非推奨になった succeeding メソッドおよび failing メソッド
VertxTestContext.succeeding()
メソッドおよび VertxTestContext.failing()
メソッドが非推奨になりました。代わりに VertxTestContext.succeedingThenComplete()
メソッドおよび VertxTestContext.failingThenComplete()
メソッドを使用してください。