プラグイン開発ガイド(compression / Java)
- 新たな圧縮アルゴリズムをSINETStream (Java)で扱えるようにするためのプラグインを開発する手順について説明します。
1. はじめに
SINETStream では設定ファイルあるいはコンストラクタのパラメータで指定するcompression.algorithm
の値に応じて、
メッセージの圧縮/展開を行います。
SINETStream v1.7 以降では以下の compression.algorithm
をサポートしています。
gzip
- apache commons-compressから java.util.zipをつかいます。
zstd
- apache commons-compressから Zstd-jniをつかいます。
gzip
, zstd
はSINETStream本体に組み込みの compression.algorithm
です。
新たなプラグインを実装することで、上記に示したcompression.algorithm
以外の圧縮アルゴリズムで
SINETStreamのメッセージを圧縮/展開できるようになります。
1.1 対象者
このドキュメントが対象としている読者を以下に示します。
- SINETStreamで新たな圧縮アルゴリズムを利用できるようにしたい開発者
1.2 前提知識
このドキュメントの説明は、以下の知識を有している読者を前提としています。
- Java 8
- ServiceLoaderの利用方法
- SINETStream の Java APIの利用方法、設定ファイルの記述方法
2. プラグインの実装方法
2.1 概要
SINETStreamのプラグインを作成するためには以下の作業が必要となります。
- プロバイダ構成ファイルの作成
- サービスプロバイダの実装
それぞれの作業項目の詳細について以下に記します。
2.2 プロバイダ構成ファイルの作成
プロバイダ構成ファイルにサービスプロバイダを登録することで、 ServiceLoaderがプラグインを見つけることができるようになります。
構成ファイルはリソースディレクトリのMETA-INF/services/
に配置します。
ファイル名はサービスプロバイダの完全修飾クラス名にする必要があります。
SINETStreamにcompression.algorithm
を追加するためのサービスプロバイダの場合、以下のファイル名となります。
jp.ad.sinet.stream.spi.CompressionProvider
構成ファイルには、サービスプロバイダの実装クラス名を完全修飾名で1クラス1行で記述します。
例えばlz4
のcompression.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
を追加するサービスプロバイダを作成するには、
以下に示すインターフェースを実装したクラスが必要となります。
jp.ad.sinet.stream.spi.CompressionProvider
- サービスプロバイダインタフェース
jp.ad.sinet.stream.api.Compression
compression
に対応したシリアライザ、デシリアライザを得るためのインタフェース
CompressionProvider
のメソッドを以下に示します。
String getName()
compression.algorithm
のタイプを表す名前を返す
Compression getCompression()
- プラグインの
compression.algorithm
に対応した圧縮/展開を得るインターフェースを返す
- プラグインの
Compression
のメソッドを以下に示します。
Compressor getCompressor()
- シリアライザを返す
Decompressor getDecompressor()
- デシリアライザを返す
String getName()
compression.algorithm
のタイプを表す名前を返す
3. プラグインの実装例
プラグイン実装の具体的な手順を示すために実装例を示します。
ここではSINETStreamのメッセージをLZ4で圧縮・展開するためのcompression
プラグインを実装します。
LZ4の実装には apache commons-compress を使います。
3.1 ファイル構成
以下のファイルを作成します。
- src/main/java/ssplugin/
- Lz4Provider.java
- Lz4Compression.java
- Lz4Compressor.java
- Lz4Decompressor.java
- src/main/resources/META-INF/services/jp.ad.sinet.stream.api.compression.CompressionProvider
- build.gradle
- settings.gradle
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ファイルを作成する手順を以下に示します。
- Gradleをインストールする
- 参考: インストール手順
- gradle を実行して jar ファイルを作成する
$ gradle jar
build/libs/
にjarファイルが作成されたことを確認する$ ls build/libs/ SINETStream-compression-lz4-compression-1.0.0.jar
3.5 ソースコード
プラグインの実装例となるファイルへのリンクを以下に示します。