BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java API for RESTful Web Services 2.1リリース

Java API for RESTful Web Services 2.1リリース

原文(投稿日:2017/08/26)へのリンク

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用のアノテーションと、WebDAVAtop 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以降で開発されたアプリケーションがサポート対象となる。

この記事を評価

採用ステージ
スタイル

この記事に星をつける

おすすめ度
スタイル

BT