第9章 avro


Avro コンポーネント

Camel 2.10 以降で利用可能
このコンポーネントは、avro のデータ形式を提供します。これにより、Apache Avro のバイナリーデータ形式を使用したメッセージのシリアライズおよびデシリアライズが可能になります。さらに、netty または http で avro を使用するためのプロデューサーおよびコンシューマーエンドポイントを提供することで、Apache Avro の rpc に対応します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-avro</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

Apache Avro の概要

Avro では、形式の json を使用してメッセージタイプとプロトコルを定義してから、指定したタイプおよびメッセージの Java コードを生成できます。スキーマは以下のようになります。
{"namespace": "org.apache.camel.avro.generated",
 "protocol": "KeyValueProtocol",

 "types": [
     {"name": "Key", "type": "record",
      "fields": [
          {"name": "key",   "type": "string"}
      ]
     },
     {"name": "Value", "type": "record",
      "fields": [
          {"name": "value",   "type": "string"}
      ]
     }
 ],

 "messages": {
     "put": {
         "request": [{"name": "key", "type": "Key"}, {"name": "value", "type": "Value"} ],
         "response": "null"
     },
     "get": {
         "request": [{"name": "key", "type": "Key"}],
         "response": "Value"
     }
 }
}
Copy to Clipboard Toggle word wrap
maven や ant などを使用して、スキーマからクラスを簡単に生成できます。詳細は、Apache Avro のドキュメント を参照してください
ただし、スキーマの最初のアプローチを強制せず、既存のクラスのスキーマを作成できます。2.12 以降、既存のプロトコルインターフェイスを使用して RCP 呼び出しを実行できます。プロトコル自体に interface を使用し、パラメーターおよび結果型には POJO Bean またはプリミティブ/String クラスを使用する必要があります。上記のスキーマに対応する クラスの例を以下に示します。
package org.apache.camel.avro.reflection;

public interface KeyValueProtocol {
    void put(String key, Value value);
    Value get(String key);
}

class Value {
    private String value;
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}
Copy to Clipboard Toggle word wrap
注記:既存のクラスは、データ形式ではなく RPC (以下を参照)にのみ使用できます。

Avro データフォーマットの使用

avro データフォーマットの使用は、ルートでマーシャリングまたはアンマーシャリングするクラスを指定するのと同じくらい簡単です。
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:in"/>
            <marshal>
                <avro instanceClass="org.apache.camel.dataformat.avro.Message"/>
            </marshal>
            <to uri="log:out"/>
        </route>
    </camelContext>
Copy to Clipboard Toggle word wrap
または、コンテキスト内で dataformat を指定し、ルートから参照することもできます。
    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
         <dataFormats>
            <avro id="avro" instanceClass="org.apache.camel.dataformat.avro.Message"/>
        </dataFormats>
        <route>
            <from uri="direct:in"/>
            <marshal ref="avro"/>
            <to uri="log:out"/>
        </route>
    </camelContext>
Copy to Clipboard Toggle word wrap
同様に、avro データフォーマットを使用して、umarshal を実行できます。

Camel での Avro RPC の使用

前述のように、Avro は、http や netty などの複数のトランスポートに対する RPC サポートも提供します。Camel は、これら 2 つのトランスポートにコンシューマーとプロデューサーを提供します。
avro:[transport]:[host]:[port][?options]
Copy to Clipboard Toggle word wrap
現在、サポートされるトランスポート値は http または netty です。
2.12 以降、URI でメッセージ名を正しく指定できます。
avro:[transport]:[host]:[port][/messageName][?options]
Copy to Clipboard Toggle word wrap
コンシューマーの場合は、複数のルートを同じソケットに割り当てることができます。正しいルートへのディスパッチは、avro コンポーネントによって自動的に行われます。messageName が指定されていないルート(ある場合)がデフォルトとして使用されます。
avro ipc に camel プロデューサーを使用する場合は、"in" メッセージボディーには、avro プロトコルに指定された操作のパラメーターが含まれている必要があります。応答は out メッセージのボディーに追加されます。
avro ipc に camel avro コンシューマーを使用する場合と同様に、リクエストパラメーターは作成されたエクスチェンジの in メッセージボディー内に配置され、エクスチェンジが処理されると、out メッセージのボディーが応答として送信されます。
注記: デフォルトでは、コンシューマーパラメーターはアレイにラップされます。2.12 でパラメーターが 1 つしかない場合は、singleParameter URI オプションを使用して、配列のラッピングなしで in メッセージボディーでダーティーとして受信できます。

Avro RPC URI オプション

Expand
名前 バージョン 説明
protocolClassName avro プロトコルのクラス名。
singleParameter 2.12 true の場合、consumer パラメーターは配列にラップされません。プロトコルがメッセージに対してさらにパラメーターを指定すると失敗する
protocol Avro Procol オブジェクト。複雑なプロトコルを作成する必要がある場合に、protocolClassName の代わりに使用できます。#name 表記を使用してレジストリーから Bean を参照できます。
reflectionProtocol 2.12 指定されたプロトコルオブジェクトがリフレクションプロトコルである場合。protocolClassName プロトコルタイプは自動検出されるため、protocol パラメーターでのみ使用する必要があります。

Avro RPC ヘッダー

Expand
名前 説明
CamelAvroMessageName 送信するメッセージの名前。コンシューマーによる URI からのメッセージ名の上書き(存在する場合)

http 経由で camel avro プロデューサーを使用する例:
        <route>
            <from uri="direct:start"/>
            <to uri="avro:http:localhost:{{avroport}}?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <to uri="log:avro"/>
        </route>
Copy to Clipboard Toggle word wrap
上記の例では、CamelAvroMessageName ヘッダーを入力する必要があります。2.12 以降、以下の構文を使用して定数メッセージを呼び出すことができます。
        <route>
            <from uri="direct:start"/>
            <to uri="avro:http:localhost:{{avroport}}/put?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <to uri="log:avro"/>
        </route>
Copy to Clipboard Toggle word wrap
Netty 経由で Camel avro コンシューマーを使用したメッセージの消費例:
        <route>
            <from uri="avro:netty:localhost:{{avroport}}?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol"/>
            <choice>
                <when>
                    <el>${in.headers.CamelAvroMessageName == 'put'}</el>
                    <process ref="putProcessor"/>
                </when>
                <when>
                    <el>${in.headers.CamelAvroMessageName == 'get'}</el>
                    <process ref="getProcessor"/>
                </when>
            </choice>
        </route>
Copy to Clipboard Toggle word wrap
2 .12 以降、同じタスクを実行するように 2 つの異なるルートを設定できます。
        <route>
            <from uri="avro:netty:localhost:{{avroport}}/put?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol">
            <process ref="putProcessor"/>
        </route>
        <route>
            <from uri="avro:netty:localhost:{{avroport}}/get?protocolClassName=org.apache.camel.avro.generated.KeyValueProtocol&singleParameter=true"/>
            <process ref="getProcessor"/>
        </route>
Copy to Clipboard Toggle word wrap
上記の例では、get は 1 つのパラメーターのみを取るため、singleParameter が使用され、getProcessor はボディーで Value クラスを直接受信しますが、putProcessor は String キーと Value 値が配列の内容として入力されるサイズ 2 の配列を受け取ります。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat