4.8. トランスコーダーとデータ変換
Data Grid は org.infinispan.commons.dataconversion.Transcoder
を使用して MediaType 形式間でデータを変換します。
public interface Transcoder { /** * Transcodes content between two different {@link MediaType}. * * @param content Content to transcode. * @param contentType The {@link MediaType} of the content. * @param destinationType The target {@link MediaType} to convert. * @return the transcoded content. */ Object transcode(Object content, MediaType contentType, MediaType destinationType); /** * @return all the {@link MediaType} handled by this Transcoder. */ Set<MediaType> getSupportedMediaTypes(); }
4.8.1. Converting Data on Demand
タスク、リスナー、マージポリシーなどのカスタムコードを Data Grid にデプロイして実行できます。Data Grid のカスタムコードはデータに直接アクセスできますが、異なるエンドポイントを介して同じデータにアクセスするクライアントとも相互運用する必要があります。たとえば、Hot Rod クライアントがバイナリー形式でデータを読み書きしているときに、カスタムオブジェクトを処理するタスクを作成できます。
この場合、application/x-protostream
をキャッシュエンコーディングとして設定して、データをバイナリー形式で格納し、異なる MediaType を使用してキャッシュ操作を実行するようにカスタムコードを設定できます。
以下に例を示します。
DefaultCacheManager cacheManager = new DefaultCacheManager(); // The cache will store POJO for keys and values ConfigurationBuilder cfg = new ConfigurationBuilder(); cfg.encoding().key().mediaType("application/x-java-object"); cfg.encoding().value().mediaType("application/x-java-object"); cacheManager.defineConfiguration("mycache", cfg.build()); Cache<Integer, Person> cache = cacheManager.getCache("mycache"); cache.put(1, new Person("John","Doe")); // Wraps cache using 'application/x-java-object' for keys but JSON for values Cache<Integer, byte[]> jsonValuesCache = (Cache<Integer, byte[]>) cache.getAdvancedCache().withMediaType("application/x-java-object", "application/json"); byte[] json = jsonValuesCache.get(1);
JSON 形式で値を返します。
{ "_type":"org.infinispan.sample.Person", "name":"John", "surname":"Doe" }
4.8.2. 組み込み型デロイメントへのトランスコーダーのインストール
Data Grid Server には、デフォルトでトランスコーダーが含まれています。ただし、Data Grid をライブラリーとして実行する場合は、以下をプロジェクトに追加する必要があります。
org.infinispan:infinispan-server-core
4.8.3. トランスコードおよびエンコーダー
通常、キャッシュ操作に関係するデータ変換はないか、1 つだけです。
- 組み込みモードまたはサーバーモードを使用したキャッシュでは、デフォルトでは変換されません。
- MediaType は設定されず、OFF_HEAP または BINARY を使用する組み込みキャッシュのエンコーダベースの変換。
- 複数の REST クライアントと Hot Rod クライアントが異なる形式でデータを送受信するサーバーモードで使用されるキャッシュの トランスコーダー ベースの変換。これらのキャッシュには、ストレージを記述する MediaType が設定されています。
ただし、高度なユースケースでは、エンコーダーとトランスコーダーの両方を同時に使用できます。
たとえば、マーシャリングされるオブジェクト (jboss marshaller を使用して) コンテンツを格納するキャッシュについて考えてみましょう。セキュリティー上の理由から、プレーンデータが外部ストアに格納されないように、透過的な暗号化レイヤーを追加する必要があります。クライアントは、複数の形式でデータを読み書きできる必要があります。
これは、エンコーディング層に関係なく、ストレージを記述する MediaType を使用してキャッシュを設定することで実現できます。
ConfigurationBuilder cfg = new ConfigurationBuilder(); cfg.encoding().key().mediaType("application/x-jboss-marshalling"); cfg.encoding().key().mediaType("application/x-jboss-marshalling");
透過的な暗号化は、たとえば次のように、保存/取得で暗号化/復号化する特別な エンコーダー でキャッシュをデコレートすることで追加できます。
class Scrambler implements Encoder { public Object toStorage(Object content) { // Encrypt data } public Object fromStorage(Object content) { // Decrypt data } @Override public boolean isStorageFormatFilterable() { } public MediaType getStorageFormat() { return new MediaType("application", "scrambled"); } @Override public short id() { //return id } }
キャッシュに書き込まれるすべてのデータが暗号化され保存されるようにするには、上記のエンコーダーでキャッシュをデコレートし、このデコレートされたキャッシュですべてのキャッシュ操作を実行する必要があります。
Cache<?,?> secureStorageCache = cache.getAdvancedCache().withEncoding(Scrambler.class).put(k,v);
キャッシュを目的の MediaType でデコレートすることにより、複数の形式でデータを読み取る機能を追加できます。
// Obtain a stream of values in XML format from the secure cache secureStorageCache.getAdvancedCache().withMediaType("application/xml","application/xml").values().stream();
内部的には、Data Grid は最初にエンコーダー fromStorage 操作を適用して、application/x-jboss-marshalling 形式のエントリーを取得し、次に適切なトランスコーダーを使用して application/xml に順次変換を適用します。