English

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

1. はじめに

SINETStream では設定ファイルあるいはコンストラクタのパラメータで指定するvalue_typeの値に応じて、 メッセージのシリアライズ、デシリアライズを行います。

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

byte_array, textはSINETStream本体に組み込みの value_type です。 imageは追加プラグインとして提供しているvalue_typeです。

新たなプラグインを実装することで、上記に示したvalue_type以外のタイプをSINETStreamのメッセージとして扱えるようになります。

1.1 対象者

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

1.2 前提知識

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

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

2.1 概要

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

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

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

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

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

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

例えばimagevalue_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を追加するサービスプロバイダを作成するには、 以下に示すインターフェースを実装したクラスが必要となります。

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

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

3. プラグインの実装例

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

ここでは java.util.MapのオブジェクトをSINETStreamのメッセージとして扱えるようにするためのvalue_typeプラグインを実装します。

3.1 ファイル構成

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

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ファイルを作成する手順を以下に示します。

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

3.5 ソースコード

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