English

プラグイン開発ガイド(compression / Java)

1. はじめに

SINETStream では設定ファイルあるいはコンストラクタのパラメータで指定するcompression.algorithmの値に応じて、 メッセージの圧縮/展開を行います。

SINETStream v1.7 以降では以下の compression.algorithm をサポートしています。

gzip, zstdはSINETStream本体に組み込みの compression.algorithm です。

新たなプラグインを実装することで、上記に示したcompression.algorithm以外の圧縮アルゴリズムで SINETStreamのメッセージを圧縮/展開できるようになります。

1.1 対象者

このドキュメントが対象としている読者を以下に示します。

このドキュメントの説明は、以下の知識を有している読者を前提としています。

2. プラグインの実装方法

2.1 概要

SINETStreamのプラグインを作成するためには以下の作業が必要となります。

それぞれの作業項目の詳細について以下に記します。

2.2 プロバイダ構成ファイルの作成

プロバイダ構成ファイルにサービスプロバイダを登録することで、 ServiceLoaderがプラグインを見つけることができるようになります。

構成ファイルはリソースディレクトリのMETA-INF/services/に配置します。 ファイル名はサービスプロバイダの完全修飾クラス名にする必要があります。 SINETStreamにcompression.algorithmを追加するためのサービスプロバイダの場合、以下のファイル名となります。

構成ファイルには、サービスプロバイダの実装クラス名を完全修飾名で1クラス1行で記述します。

例えばlz4compression.algorithmを追加するクラスjp.ad.sinet.stream.api.compression.Lz4CompressionProviderを追加する場合、 以下の内容を構成ファイルMETA-INF/services/jp.ad.sinet.stream.spi.CompressionProviderに記します。

jp.ad.sinet.stream.api.compression.Lz4CompressionProvider

2.3 サービスプロバイダの実装

compression.algorithmを追加するサービスプロバイダを作成するには、 以下に示すインターフェースを実装したクラスが必要となります。

CompressionProvider のメソッドを以下に示します。

Compression のメソッドを以下に示します。

3. プラグインの実装例

プラグイン実装の具体的な手順を示すために実装例を示します。

ここではSINETStreamのメッセージをLZ4で圧縮・展開するためのcompressionプラグインを実装します。 LZ4の実装には apache commons-compress を使います。

3.1 ファイル構成

以下のファイルを作成します。

3.2 実装クラス

プラグインとして実装するクラスについて説明します。

3.2.1 Lz4Providerクラス

プラグインのプロバイダインタフェースCompressionProviderを実装したクラスになります。

このプラグインのCompression実装となるLz4Compressionオブジェクトを返すgetCompression()とタイプ名を返すgetName()の実装を行います。

import jp.ad.sinet.stream.api.Compression;
import jp.ad.sinet.stream.spi.CompressionProvider;
public class Lz4Provider implements CompressionProvider {
    private static final Compression compression = new Lz4Compression();

    @Override
    public Compression getCompression() {
        return compression;
    }

    @Override
    public String getName() {
        return compression.getName();
    }
}

3.2.2 Lz4Compressionクラス

このプラグインのCompression実装になります。

import jp.ad.sinet.stream.api.Compression;
import jp.ad.sinet.stream.api.Compressor;
import jp.ad.sinet.stream.api.Decompressor;

class Lz4Compression implements Compression {
    @Override
    public String getName() {
        return "lz4";
    }

    @Override
    public Compressor getCompressor(Integer level, Map<String, Object> parameters) {
        return new Lz4Compressor(level, parameters);
    }

    @Override
    public Decompressor getDecompressor(Map<String, Object> parameters) {
        return new Lz4Decompressor(parameters);
    }
}

getName()はcompressorのタイプ名を返します。 getCompressor(), getDecompressor()はそれぞれ圧縮、展開を返します。

3.2.3 Lz4Compressorクラス

LZ4の圧縮の実装になります。

import jp.ad.sinet.stream.api.Compressor;
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorOutputStream;

class Lz4Compressor implements Compressor {
    Integer level;

    public Lz4Compressor(Integer level, Map<String, Object> parameters) {
	this.level = level;
    }

    @Override
    public byte[] compress(byte[] data) {
        ByteArrayOutputStream compOut = new ByteArrayOutputStream();
	OutputStream compIn = new FramedLZ4CompressorOutputStream(compOut);
	compIn.write(data);
	compIn.flush();
	return compOut.toByteArray();
    }
 }

3.2.4 Lz4Decompressorクラス

LZ4の展開の実装になります。

import jp.ad.sinet.stream.api.Decompressor;
import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream;

class Lz4Decompressor implements Decompressor {
    public Lz4Decompressor(Map<String, Object> parameters) {
    }

    @Override
    public byte[] decompress(byte[] data) {
	int bufsz = 1000;
	ByteArrayInputStream decompIn = new ByteArrayInputStream(bytes);
	ByteArrayOutputStream data = new ByteArrayOutputStream(bufsz);
	InputStream decompOut = new FramedLZ4CompressorInputStream(decompIn);
	byte[] buf = new byte[bufsz];
	int n = 0;
	while ((n = decompOut.read(buf)) != -1) {
	    data.write(buf, 0, n);
	}
	return data.toByteArray();
    }
}

3.3 プロバイダ構成ファイルの作成

リソースディレクトリのMETA-INF/services/に構成ファイルjp.ad.sinet.stream.spi.CompressionProviderを以下の内容で作成します。

ssplugin.Lz4CompressionProvider

3.4 jarファイルの作成

プラグインのjarファイルを作成する手順を以下に示します。

  1. Gradleをインストールする
  2. gradle を実行して jar ファイルを作成する
    $ gradle jar
    
  3. build/libs/にjarファイルが作成されたことを確認する
    $ ls build/libs/
    SINETStream-compression-lz4-compression-1.0.0.jar
    

3.5 ソースコード

プラグインの実装例となるファイルへのリンクを以下に示します。