最新の安定バージョンについては、Spring Integration 7.0.4 を使用してください! |
コーデック
Spring Integration のバージョン 4.2 は、Codec 抽象化を導入しました。コーデックは、byte[] との間でオブジェクトをエンコードおよびデコードします。Java 直列化の代替手段を提供します。1 つの利点は、通常、オブジェクトが Serializable を実装する必要がないことです。Kryo [GitHub] (英語) を使用して直列化する実装を 1 つ提供していますが、次のコンポーネントで使用する独自の実装を提供できます。
EncodingPayloadTransformerDecodingTransformerCodecMessageConverter
EncodingPayloadTransformer
このトランスフォーマーは、コーデックを使用してペイロードを byte[] にエンコードします。メッセージヘッダーには影響しません。
詳細については、Javadoc を参照してください。
DecodingTransformer
このトランスフォーマーは、コーデックを使用して byte[] をデコードします。オブジェクトのデコード先の Class (または Class に解決される式)で構成する必要があります。結果のオブジェクトが Message<?> の場合、受信ヘッダーは保持されません。
詳細については、Javadoc を参照してください。
CodecMessageConverter
特定のエンドポイント(TCP や Redis など)には、メッセージヘッダーの概念がありません。それらは MessageConverter の使用をサポートし、CodecMessageConverter は、送信のためにメッセージを byte[] との間で変換するために使用できます。
詳細については、Javadoc を参照してください。
Kryo
現在、これは Codec の唯一の実装であり、2 種類の Codec を提供します。
PojoCodec: トランスで使用MessageCodec:CodecMessageConverterで使用
フレームワークは、いくつかのカスタムシリアライザーを提供します。
FileSerializerMessageHeadersSerializerMutableMessageHeadersSerializer
最初のものは、FileKryoRegistrar で初期化することにより、PojoCodec で使用できます。2 番目と 3 番目は MessageCodec で使用され、MessageKryoRegistrar で初期化されます。
Kryo のカスタマイズ
デフォルトでは、Kryo は未知の Java 型を FieldSerializer に委譲します。Kryo は、String、Collection、Map とともに、各プリミティブ型のデフォルトのシリアライザーも登録します。FieldSerializer は、反射を使用してオブジェクトグラフをナビゲートします。より効率的なアプローチは、オブジェクトの構造を認識し、選択したプリミティブフィールドを直接直列化できるカスタムシリアライザーを実装することです。次の例は、そのようなシリアライザーを示しています。
public class AddressSerializer extends Serializer<Address> {
@Override
public void write(Kryo kryo, Output output, Address address) {
output.writeString(address.getStreet());
output.writeString(address.getCity());
output.writeString(address.getCountry());
}
@Override
public Address read(Kryo kryo, Input input, Class<Address> type) {
return new Address(input.readString(), input.readString(), input.readString());
}
}Serializer インターフェースは Kryo、Input、Output を公開します。これにより、Kryo ドキュメント [GitHub] (英語) に従って、含まれるフィールドやその他の内部設定を完全に制御できます。
| カスタムシリアライザーを登録するときは、登録 ID が必要です。登録 ID は任意です。ただし、この場合、分散アプリケーション全体の各 Kryo インスタンスは同じ ID を使用する必要があるため、ID を明示的に定義する必要があります。Kryo は小さな正の整数を推奨し、いくつかの ID(値 <10)を予約します。Spring Integration は現在、40, 41,, 42 を使用するようにデフォルト設定されています(前述のファイルおよびメッセージヘッダーシリアライザー用)。フレームワークを拡張できるように、60 から開始することをお勧めします。前述のレジストラを構成することにより、これらのフレームワークのデフォルトをオーバーライドできます。 |
カスタム Kryo シリアライザーの使用
カスタマイズにはネイティブ API を使用する必要があるため、カスタムの直列化が必要な場合は、Kryo [GitHub] (英語) のドキュメントを参照してください。例については、org.springframework.integration.codec.kryo.MessageCodec 実装を参照してください。
KryoSerializable の実装
ドメインオブジェクトのソースコードへの write アクセス権がある場合は、ここで説明されているように KryoSerializable を実装できます。この場合、クラスは直列化メソッド自体を提供し、それ以上の構成は必要ありません。ただし、ベンチマークは、これがカスタムシリアライザーを明示的に登録するほど効率的ではないことを示しています。次の例は、カスタム Kryo シリアライザーを示しています。
public class Address implements KryoSerializable {
@Override
public void write(Kryo kryo, Output output) {
output.writeString(this.street);
output.writeString(this.city);
output.writeString(this.country);
}
@Override
public void read(Kryo kryo, Input input) {
this.street = input.readString();
this.city = input.readString();
this.country = input.readString();
}
}この手法を使用して、Kryo 以外の直列化ライブラリをラップすることもできます。