第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>
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"
}
}
}
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; }
}
注記:既存のクラスは、データ形式ではなく 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>
または、コンテキスト内で 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>
同様に、avro データフォーマットを使用して、umarshal を実行できます。
Camel での Avro RPC の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
前述のように、Avro は、http や netty などの複数のトランスポートに対する RPC サポートも提供します。Camel は、これら 2 つのトランスポートにコンシューマーとプロデューサーを提供します。
avro:[transport]:[host]:[port][?options]
現在、サポートされるトランスポート値は http または netty です。
2.12 以降、URI でメッセージ名を正しく指定できます。
avro:[transport]:[host]:[port][/messageName][?options]
コンシューマーの場合は、複数のルートを同じソケットに割り当てることができます。正しいルートへのディスパッチは、avro コンポーネントによって自動的に行われます。messageName が指定されていないルート(ある場合)がデフォルトとして使用されます。
avro ipc に camel プロデューサーを使用する場合は、"in" メッセージボディーには、avro プロトコルに指定された操作のパラメーターが含まれている必要があります。応答は out メッセージのボディーに追加されます。
avro ipc に camel avro コンシューマーを使用する場合と同様に、リクエストパラメーターは作成されたエクスチェンジの in メッセージボディー内に配置され、エクスチェンジが処理されると、out メッセージのボディーが応答として送信されます。
注記: デフォルトでは、コンシューマーパラメーターはアレイにラップされます。2.12 でパラメーターが 1 つしかない場合は、
singleParameter URI オプションを使用して、配列のラッピングなしで in メッセージボディーでダーティーとして受信できます。
Avro RPC URI オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | バージョン | 説明 |
|---|---|---|
protocolClassName
|
avro プロトコルのクラス名。 | |
singleParameter
|
2.12 | true の場合、consumer パラメーターは配列にラップされません。プロトコルがメッセージに対してさらにパラメーターを指定すると失敗する |
protocol
|
Avro Procol オブジェクト。複雑なプロトコルを作成する必要がある場合に、protocolClassName の代わりに使用できます。#name 表記を使用してレジストリーから Bean を参照できます。
|
|
reflectionProtocol
|
2.12 |
指定されたプロトコルオブジェクトがリフレクションプロトコルである場合。protocolClassName プロトコルタイプは自動検出されるため、protocol パラメーターでのみ使用する必要があります。
|
Avro RPC ヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | 説明 |
|---|---|
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>
上記の例では、
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>
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>
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>
上記の例では、get は 1 つのパラメーターのみを取るため、
singleParameter が使用され、getProcessor はボディーで Value クラスを直接受信しますが、putProcessor は String キーと Value 値が配列の内容として入力されるサイズ 2 の配列を受け取ります。