ナビゲーションをスキップ

4.1における新機能と注目すべき変更点

このページはGitHub Wikiページから自動生成されていることをご存知ですか? こちらからご自身で改善することができます!

このドキュメントでは、Netty 4.1と4.0の間の注目すべき変更点と新機能の一覧について説明します。

要約

4.0との後方互換性を維持するために最善を尽くしましたが、4.1には4.0と完全な後方互換性がない可能性のある複数の追加が含まれています。新しいバージョンに対してアプリケーションを再コンパイルしてください。

アプリケーションを再コンパイルすると、非推奨の警告が表示される場合があります。次のバージョンにアップグレードする際に問題が発生しないように、提案されている代替手段を使用してすべて修正してください。

コアの変更点

Androidのサポート

以下の点を考慮して、

  • モバイルデバイスがますます強力になっていること、
  • ADKのNIOとSSLEngineに関する既知の問題のほとんどがIce Cream Sandwich以降で修正されていること、そして
  • ユーザーがモバイルアプリケーションでコーデックとハンドラーを再利用したいと考えていることは明らかであるため、

Android(4.0以上)を公式にサポートすることにしました。

ただし、Android用の自動テストスイートはまだありません。 Androidで問題が発生した場合は、お気軽に問題を報告してください。また、Androidテストをビルドプロセスの一部にするために、プロジェクトに貢献することを検討してください。

ChannelHandlerContext.attr(..) == Channel.attr(..)

ChannelChannelHandlerContextはどちらも、ユーザーが1つ以上のユーザー定義属性をアタッチできるようにするために、AttributeMapインターフェースを実装しています。ユーザーを混乱させることがあったのは、ChannelChannelHandlerContextがユーザー定義属性用に独自のストレージを持っていたことです。たとえば、Channel.attr(KEY_X).set(valueX)を介して属性 'KEY_X'を設定しても、ChannelHandlerContext.attr(KEY_X).get()を介して見つけることはできず、逆もまた同様です。この動作は混乱を招くだけでなく、メモリの無駄遣いでもあります。

この問題に対処するために、Channelごとに1つのマップのみを内部に保持することにしました。 AttributeMapは常にAttributeKeyをキーとして使用します。 AttributeKeyは各キー間の一意性を保証するため、Channelごとに複数の属性マップを持つ意味はありません。ユーザーが独自のAttributeKeyChannelHandlerのプライベート静的最終フィールドとして定義する限り、キーが重複するリスクはありません。

Channel.hasAttr(...)

属性が存在するかどうかを効率的に確認できるようになりました。

より簡単で正確なバッファリーク追跡

以前は、バッファリークが発生した場所を見つけるのが容易ではなく、リークの警告はあまり役に立ちませんでした。現在、オーバーヘッドの増加を犠牲にして有効にすることができる高度なリーク報告メカニズムがあります。

詳細については、参照カウントオブジェクトを参照してください。この機能は、その重要性から4.0.14.Finalにもバックポートされています。

デフォルトのアロケーターとしてのPooledByteBufAllocator

4.xでは、UnpooledByteBufAllocatorはその制限にもかかわらずデフォルトのアロケーターでした。 PooledByteBufAllocatorがしばらくの間使用されており、高度なバッファリーク追跡メカニズムが導入されたため、新しいデフォルトにする時期が来ました。

グローバルに一意のチャネルID

すべてのChannelは、以下から生成されるグローバルに一意のIDを持つようになりました。

  • MACアドレス(EUI-48またはEUI-64)、できればグローバルに一意のもの、
  • 現在のプロセスID、
  • System#currentTimeMillis()
  • System#nanoTime()
  • ランダムな32ビット整数、および
  • シーケンシャルにインクリメントされる32ビット整数。

ChannelのIDは、Channel.id()メソッドを使用して取得できます。

EmbeddedChannelの使いやすさ

EmbeddedChannelreadInbound()readOutbound()は、アドホック型パラメータを返すため、戻り値をダウンキャストする必要はありません。これにより、ユニットテストコードの冗長性がかなり軽減されます。

EmbeddedChannel ch = ...;

// BEFORE:
FullHttpRequest req = (FullHttpRequest) ch.readInbound();

// AFTER:
FullHttpRequest req = ch.readInbound();

ThreadFactoryの代わりにExecutorを使用する機能

一部のアプリケーションでは、ユーザーが指定されたExecutorでタスクを実行する必要があります。 4.xでは、イベントループを作成するときにThreadFactoryを指定する必要がありましたが、今は必要ありません。

この変更の詳細については、プルリクエスト#1762を参照してください。

クラスローダーフレンドリー

AttributeKeyなどの一部のタイプは、コンテナ環境で実行されるアプリケーションにとって不親切でしたが、今はそうではありません。

ByteBufAllocator.calculateNewCapacity()

拡張されたByteBufの新しい容量を計算するロジックは、AbstractByteBufからByteBufAllocatorに移動されました。これは、ByteBufAllocatorが管理するバッファの容量計算をよりよく理解しているためです。

新しいコーデックとハンドラー

  • バイナリmemcacheプロトコルコーデック
  • 圧縮コーデック
    • BZip2
    • FastLZ
    • LZ4
    • LZF
  • DNSプロトコルコーデック
  • HAProxyプロトコルコーデック
  • MQTTプロトコルコーデック
  • SPDY / 3.1のサポート
  • STOMPコーデック
  • バージョン4、4a、および5をサポートするSOCKSxコーデック。 socksxパッケージを参照してください。
  • XMLドキュメントのストリーミングを可能にするXmlFrameDecoder
  • JSONオブジェクトのストリーミングを可能にするJsonObjectDecoder
  • IPフィルタリングハンドラー

その他のコーデックの変更

AsciiString

AsciiStringは、1バイト文字のみを含む新しいCharSequence実装です。 US-ASCIIまたはISO-8859-1文字列を扱う場合に、このクラスが役立ちます。

たとえば、NettyのHTTPコーデックとSTOMPコーデックは、ヘッダー名を表すためにAsciiStringを使用します。 AsciiStringByteBufにエンコードするときに変換コストがかからないため、Stringを使用するよりも優れたパフォーマンスが保証されます。

TextHeaders

TextHeadersは、HTTPヘッダーのような文字列マルチマップの汎用データ構造を提供します。 HttpHeadersTextHeadersを使用して書き直されました。

MessageAggregator

MessageAggregatorは、HttpObjectAggregatorと同様に、複数の小さなメッセージを大きなメッセージに集約する汎用機能を提供します。 HttpObjectAggregatorMessageAggregatorを使用して書き直されました。

HttpObjectAggregatorによる oversized メッセージのより良い処理

4.0では、100-continueヘッダーが存在する場合でも、クライアントがコンテンツを送信する前に oversized なHTTPメッセージを拒否する方法はありませんでした。

このリリースでは、handleOversizedMessageと呼ばれるオーバーライド可能なメソッドが追加され、ユーザーが好みのタスクを実行できるようになりました。デフォルトでは、「413 Request Entity Too Large」レスポンスで応答し、接続を閉じます。

ChunkedInputとChunkedWriteHandler

ChunkedInputには、転送の進行状況とストリームの全長をそれぞれ返す2つの新しいメソッド、progress()length()があります。 ChunkedWriteHandlerはこの情報を使用してChannelProgressiveFutureListenerに通知します。

SnappyFramedEncoderSnappyFramedDecoder

これら2つのクラスの名前がSnappyFrameEncoderSnappyFrameDecoderに変更されました。古いクラスは非推奨としてマークされており、実際には新しいクラスのサブクラスです。

最終取得日: 2024年7月19日