第10章 データのデコード - MIME デコーダー

すべての JBossESB ゲートウェイは、「メッセージコンポーザー」のコンセプトをサポートしています。このメッセージコンポーザーとは、MessageComposer を実装し、ESB メッセージインスタンスの構築と関連の ESB サービスへの送信を担当するクラスです。
MIME デコーダーは、MimeDecoder インターフェースを実装するクラスです。MessageComposer 実装が MIME デコーダーを使用して、バイナリエンコードデータの MIME タイプをもとに、バイナリアレイを特定の Java オブジェクトタイプにデコードします。
MimeDecoder の仕組みを使用したゲートウェイには、ファイルと FTP ゲートウェイリスナーなどがあります。これらのゲートウェイは、"mimeType" または "mimeDecoder" プロパティで設定でき、特定の Mime タイプに適切な MimeDecoder 実装のインストールをトリガーします。

10.1. MimeDecoder の実装

このプロセスは大変簡単です。
  1. org.jboss.soa.esb.listeners.message.mime.MimeDecoder インターフェースを実装するクラスを作成します。
  2. @MimeType アノテーションで新規作成されたクラスに注釈を付け、アノテーションの値として mime タイプを指定します。
  3. META-INF/org/jboss/soa/esb/listeners/message/mime/decoders.lst で新規作成クラスを定義します。このファイルは実行時にクラスパスに存在している必要があります。モジュールにこのファイルがない場合、このファイルをお使いのモジュールソース/リソースに追加して、実行時にその場所に置いておくようにしてください。
  4. (任意) MimeDecoder 実装がリスナー設定にアクセスする必要がある場合 (追加設定情報)、org.jboss.soa.esb.Configurable インターフェースを実装するクラスを持たせるようにしてください。
実例:
@MimeType("text/plain")
public class TextPlainMimeDecoder implements MimeDecoder, Configurable {

    private Charset encodingCharset;
    
    public void setConfiguration(ConfigTree configTree) throws ConfigurationException {
        AssertArgument.isNotNull(configTree, "configTree");
        
        String encoding = configTree.getAttribute("encoding", "UTF-8");
        encodingCharset = Charset.forName(encoding);
    }

    public Object decode(byte[] bytes) throws MimeDecodeException {
        try {
            return new String(bytes, encodingCharset.name());
        } catch (UnsupportedEncodingException e) {
            throw new MimeDecodeException("Unexpected character encoding error.", e);
        }
    }
}

10.2. ゲートウェイ実装での MimeDecoder の使用

リスナーインスタンス設定 (ConfigTree) と MimeDecoder.Factory クラスファクトリメソッドを使うのが、インストールした Mime デコーダーを使用した MessageComposer の最も簡単な方法です。
this.mimeDecoder = MimeDecoder.Factory.getInstanceByConfigTree(config);
これは“mimeType” または “mimeDecoder” 設定プロパティのいずれかを指定するリスナー設定に左右されます (ファイルと FTP リスナーにサポートされる):
<fs-listener name="FileGateway1" busidref="fileChannel1" is-gateway="true" 
                                poll-frequency-seconds="10">
    <property name="mimeType" value="text/plain" />
    <property name="encoding" value="UTF-8" />
</fs-listener>
<fs-listener name="FileGateway2" busidref="fileChannel2" is-gateway="true" 
                                poll-frequency-seconds="10">
    <property name="mimeDecoder" value="com.acme.mime.ImageJPEGMimeDecoder” />
</fs-listener>
MessageComposer インスタンスが単に mimeDecoder インスタンスでデコードメソッドを呼び出すだけで、トランスポートのペイロードを実際にデコードします。
Object decodedPayload = mimeDecoder.decode(payloadBytes);
作成された ESB Message インスタンスに“decodedPayload” オブジェクトインスタンスを設定します。

10.3. 事前定義された MimeDecoder 実装

JBossESB 4.8 には、以下の MimeDecoder 実装があります。まだ実装されていないMimeDecoder が必要な場合、「MimeDecoder の実装」の本章で前述されている説明に従ってください。

10.3.1. text/plain

TextPlainMimeDecoder は “text/plain” データを処理して、byte[] を String (デフォルト) または char[] にデコードします。

表10.1 プロパティ

プロパティ 説明 コメント
encoding
byte[] でエンコードされている text/plain データの文字エンコード
デフォルト “UTF-8”
decodeTo
text/plain データのデコーディング方法
  • “STRING” (デフォルト): text/plain データを java.lang.String にデコード
  • “CHARS”: text/plain データを char[] にデコード
デフォルト “STRING”