プラグイン開発ガイド(message type/ Java)
- 新たなメッセージタイプをSINETStream (Java)で扱えるようにするためのプラグインを開発する手順について説明します。
1. はじめに
SINETStream では設定ファイルあるいはコンストラクタのパラメータで指定するvalue_typeの値に応じて、
メッセージのシリアライズ、デシリアライズを行います。
SINETStream v1.1 以降では以下の value_type をサポートしています。
byte_arraybyte[]型のメッセージに対応するタイプ- シリアライザ、デシリアライザは入力をそのまま出力する
textString型のメッセージに対応するタイプ- シリアライザは文字列に対して
.getBytes(StandardCharsets.UTF_8)にてバイト列に変換する - デシリアライザはバイト列を
new String(bytes, StandardCharsets.UTF_8)にて文字列に変換する
image- 画像(
java.awt.image.BufferedImage)のメッセージに対応するタイプ - シリアライザは
BufferedImageをPNGファイルフォーマットのバイト列に変換する - デシリアライザは画像ファイルフォーマットのバイト列を
BufferedImageの画像オブジェクトに変換する
- 画像(
byte_array, textはSINETStream本体に組み込みの value_type です。
imageは追加プラグインとして提供しているvalue_typeです。
新たなプラグインを実装することで、上記に示したvalue_type以外のタイプをSINETStreamのメッセージとして扱えるようになります。
1.1 対象者
このドキュメントが対象としている読者を以下に示します。
- SINETStreamで新たなメッセージタイプを利用できるようにしたい開発者
1.2 前提知識
このドキュメントの説明は、以下の知識を有している読者を前提としています。
- Java 8
- ServiceLoaderの利用方法
- SINETStream の Java APIの利用方法、設定ファイルの記述方法
2. プラグインの実装方法
2.1 概要
SINETStreamのプラグインを作成するためには以下の作業が必要となります。
- プロバイダ構成ファイルの作成
- サービスプロバイダの実装
それぞれの作業項目の詳細について以下に記します。
2.2 プロバイダ構成ファイルの作成
プロバイダ構成ファイルにサービスプロバイダを登録することで、 ServiceLoaderがプラグインを見つけることができるようになります。
構成ファイルはリソースディレクトリのMETA-INF/services/に配置します。
ファイル名はサービスプロバイダの完全修飾クラス名にする必要があります。
SINETStreamにvalue_typeを追加するためのサービスプロバイダの場合、以下のファイル名となります。
jp.ad.sinet.stream.spi.ValueTypeProvider
構成ファイルには、サービスプロバイダの実装クラス名を完全修飾名で1クラス1行で記述します。
例えばimageのvalue_typeを追加するクラスjp.ad.sinet.stream.api.valuetype.ImageValueTypeProviderを追加する場合、
以下の内容を構成ファイルMETA-INF/services/jp.ad.sinet.stream.spi.ValueTypeProviderに記します。
jp.ad.sinet.stream.api.valuetype.ImageValueTypeProvider
2.3 サービスプロバイダの実装
value_typeを追加するサービスプロバイダを作成するには、
以下に示すインターフェースを実装したクラスが必要となります。
jp.ad.sinet.stream.spi.ValueTypeProvider- サービスプロバイダインタフェース
jp.ad.sinet.stream.api.ValueTypevalue_typeに対応したシリアライザ、デシリアライザを得るためのインタフェース
ValueTypeProvider のメソッドを以下に示します。
String getName()value_typeのタイプを表す名前を返す
ValueType getValueType()- プラグインの
value_typeに対応したシリアライザ、デシリアライザを得るインターフェースを返す
- プラグインの
ValueType のメソッドを以下に示します。
Serializer getSerializer()- シリアライザを返す
Deserializer getDeserializer()- デシリアライザを返す
String getName()value_typeのタイプを表す名前を返す
3. プラグインの実装例
プラグイン実装の具体的な手順を示すために実装例を示します。
ここでは java.util.MapのオブジェクトをSINETStreamのメッセージとして扱えるようにするためのvalue_typeプラグインを実装します。
3.1 ファイル構成
以下のファイルを作成します。
- src/main/java/ssplugin/
- MapTypeProvider.java
- MapYamlType.java
- MapYamlSerializer.java
- MapYamlDeserializer.java
- src/main/resources/META-INF/services/jp.ad.sinet.stream.api.valuetype.ValueTypeProvider
- build.gradle
- settings.gradle
3.2 実装クラス
プラグインとして実装するクラスについて説明します。
3.2.1 MapTypeProviderクラス
プラグインのプロバイダインタフェースValueTypeProviderを実装したクラスになります。
このプラグインのValueType実装となるMapYamlTypeオブジェクトを返すgetValueType()とタイプ名を返すgetName()の実装を行います。
public class MapTypeProvider implements ValueTypeProvider {
private static final ValueType valueType = new MapYamlType();
@Override
public ValueType getValueType() {
return valueType;
}
@Override
public String getName() {
return valueType.getName();
}
}
3.2.2 MapYamlTypeクラス
このプラグインのValueType実装になります。
class MapYamlType implements ValueType {
private static final Serializer serializer = new MapYamlSerializer();
private static final Deserializer deserializer = new MapYamlDeserializer();
@Override
public String getName() {
return "map_yaml";
}
@Override
public Serializer getSerializer() {
return serializer;
}
@Override
public Deserializer getDeserializer() {
return deserializer;
}
}
getName()はvalue_typeのタイプ名を返します。
getSerializer(), getDeserializer()はそれぞれシリアライザ、デシリアライザを返します。
3.2.3 MapYamlSerializerクラス
Mapのシリアライザの実装になります。MapをYAMLフォーマットのバイト列に変換する処理を行っています。
class MapYamlSerializer implements Serializer<Map> {
@Override
public byte[] serialize(Map map) {
Yaml yaml = new Yaml();
return yaml.dump(map).getBytes(StandardCharsets.UTF_8);
}
}
3.2.4 MapYamlDeserializerクラス
Mapのデシリアライザの実装になります。YAMLフォーマットのバイト列をMapに変換する処理を行っています。
class MapYamlDeserializer implements Deserializer<Map> {
@Override
public Map deserialize(byte[] aByte) {
Yaml yaml = new Yaml();
return yaml.load(new String(aByte, StandardCharsets.UTF_8));
}
}
3.3 プロバイダ構成ファイルの作成
リソースディレクトリのMETA-INF/services/に構成ファイルjp.ad.sinet.stream.spi.ValueTypeProviderを以下の内容で作成します。
ssplugin.MapTypeProvider
3.4 jarファイルの作成
プラグインのjarファイルを作成する手順を以下に示します。
- Gradleをインストールする
- 参考: インストール手順
- gradle を実行して jar ファイルを作成する
$ gradle jar build/libs/にjarファイルが作成されたことを確認する$ ls build/libs/ SINETStream-type-map-yaml-1.0.0.jar
3.5 ソースコード
プラグインの実装例となるファイルへのリンクを以下に示します。