JAX-RS 2.1 Java API for RESTful Web Servicesが今週リリースされた。Oracleのテクニカルスタッフの主要メンバでJSRの仕様リーダであるSantiago Pericas-Geertsen氏によると、JAX-RS 2.1ではSSE(Server-Send Event)とJSON-Bが新たにサポートされ、JSON-Pのサポートが改良されている。APIにもクライアントAPIへのリアクティブな拡張とともに、Java 8 CompletionStageの組み込みサポート、RxJavaなど他のリアクティブAPIのための拡張ポイントが追加されている。
JAX-RS 2.1仕様によると、今回のリリースの目標はPOJO用のアノテーションと、WebDAVやAtop Publishing Protocolを含む一般的なHTTP利用パターンとアプリケーションの高レベルなサポートにある。APIではさまざまなHTTPエンティティボディのコンテントタイプ、いくつかのコンテナ、JAX-WSプロバイダがサポートされる予定だ。さらにこのAPIでは、Webソースクラス内のJava EE機能とコンポーネントもサポートされる。
Pericas-Geertsen氏に話を聞いた。氏はSSEを詳しく説明してくれた。
SSE(Server-sent-event)リソースはSeeEventSinkと呼ばれる特殊なタイプを注入して、text/event-streamを生成します。SSEクライアントはSeeEventSourceを使って、コネクションからイベントを読み取ります。
このメカニズムでは、長時間の接続とブロードキャストを使用することで、ポーリングや、リソース集約型である短時間のコネクションよりも優れたパフォーマンスを提供します。
次のブロックは、SSEの使用方法を示したものだ。
サーバ:
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getMessageQueue(@Context Sse sse, @Context SseEventSink eventSink) {
// Resource method is invoked when a client subscribes to an event stream.
// That implies that sending events will most likely happen from different
// context - thread / event handler / etc, so common implementation of the
// resource method will store the eventSink instance and the application
// logic will retrieve it when an event should be emitted to the client.
// sending events:
eventSink.send(sse.newEvent("event1"));
}
クライアント:
WebTarget target = ClientBuilder.newClient().target("server-sent-events");
SseEventSource eventSource = SseEventSource.target(target).build();
// EventSource#register(Consumer<InboundSseEvent>)
// Registered event handler will print the received message.
eventSource.register(System.out::println);
// Subscribe to the event stream.
eventSource.open();
Pericas-Geertsen氏はさらに、次のことを教えてくれた。
-
JAX-RS 2.1は、従来のリリースと完全な下位互換性がある。
-
新機能は、既存のJAX-RSのコンセプトに非常によく統合されている。例えば、クライアント呼び出しにメソッドコールを単に注入するだけで、処理を同期からリアクティブにスイッチすることが可能である。
-
SEEはストリーミングHTTPベースのコネクションに依存しているので、既存のAPIに対する自然な拡張となっている。
APIはアノテーションとラムダ式を広範囲に使用するので、Java 8以降で開発されたアプリケーションがサポート対象となる。
この記事を評価
- 編集者評
- 編集長アクション