第18章 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>
<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>
18.1. 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" } } }
{"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 呼び出しを行うことができます。プロトコル自体にはインターフェイスを使用し、パラメーターと結果の型には POJO Bean またはプリミティブ/文字列クラスを使用する必要があります。上記のスキーマに対応するクラスの例を次に示します。
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; } }
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 (以下を参照) にのみ使用できます。