2016-12-08 6 views
3

Javaアプリケーションでイベントを公開するためのシリアル化フォーマットとしてAvroを検討しています。実行時に未知のAvroメッセージを特定のJavaクラスに変換することは可能ですか?

私がしたいのは、いくつかのAvroバイトをAvro Mavenプラグインを使って生成した特定のJavaクラスのインスタンスに変換することです。逆も同様です。

私のコードを使用している開発者が特定のイベントを購読し、その特定のイベントを表す特定の生成クラスのインスタンスを受け取ることができるようにしたいと思います。 Object、ただしAvro固有のコードに触れる必要はありません)。

SpecificDatumReaderを使用してコードを記述し、生成されたクラスを渡してどのクラスを期待するかを指定することで、これを行うことができます。残念なことに、これは生成されたすべてのクラスのコードを記述する必要があります。代わりにGenericDatumReaderを使用していますが、これは私が望む生成されたクラスのインスタンスを与えません。私はこれら2つのソリューションの間に何かを求め、出力として特定のオブジェクトを取得しますが、汎用アプローチの柔軟性を持っています。

私は、シリアライズされたメッセージのスキーマをチェックし、このためのSpecificDatumReaderを作成し、生成されたクラスのインスタンスを作成するソリューションを考えています。

これはすべて可能ですか?私はこれについてどうやって行くのですか?どんな助けもありがとう!

より具体的なコンテキスト情報:私は、SpringアプリケーションでRabbitMQを使用してこれらのイベントを公開し、購読しています。 SpringはRabbitMQを簡単に使用できるようにRabbitTemplateを提供しています。このクラスではMessageConverterを設定できます。私がしたいのは、バイトを数多くの可能なJavaオブジェクト(Mavenプラグインで生成されたもの)とJavaオブジェクトをバイトに変換するために作成したAvroスキーマを使用する一般的なMessageConverterを作成することです。後者(オブジェクトからバイトへ)は実行可能なように聞こえるが、私は以前のもの(オブジェクトへのバイト)についてどのように動くか分からない。

更新日12月29日2016 :提案された解決策はどれも私たちのためには役に立たなかった。最終的に我々はAvroから離れ、まったく別の解決策に向かった。したがって、私はそれが私を助けなかったし、その正しさを保証することはできませんので、私は提案された答えを受け入れません。

+0

お問い合わせください。自分で試してみてください。 –

+0

@PhilippSanderこんにちはフィリップス、私は試しているが、私はこの機能を有効にするように見えるAPIを見つけることができないので固執しています。私は誰かが正しい方向に私を指すことができることを望んでいた、私は誰もこのコードを書くことを求めていない。 –

答えて

0

Avroバイナリエンコーディングにはそのデータがないため、Avroバイナリエンコーディングからレコードタイプを取得するAvro APIはありません。レコードは、フィールドの値を宣言された順序で符号化することによって符号化されます。言い換えれば、レコードはフィールドのエンコーディングの連結のみとしてエンコードされます。フィールド値はスキーマごとにエンコードされます。そのためAvroはデータをデコードするために元々データのエンコードに使用されていたスキーマを提供する必要があります。

Avroのバイナリエンコーディングによって出力されるバイトにはレコードタイプが指定されていないため、レコードタイプをAvroのバイナリエンコードデータに沿って送信する必要があります。 RabbitMQに送信されるメッセージを、(1)データのエンコードに使用されたスキーマと(2)Avroバイナリでエンコードされたデータのコンポジションに変更します。スキーマをインクルードしてメッセージサイズを爆破することができない場合は、代わりにスキーマの識別子を含めることができます。消費者プログラムは、その識別子によってschema registryからスキーマを検索します。カスタムMessageConverterは、メッセージからスキーマを抽出して、メッセージに多数のレコードタイプのうちのどれが含まれているかを確認できます。

+0

ありがとう@顎 - 黄!プロトコルの多くのレコードタイプのどれがメッセージであるかを知ることができるかどうかは疑問だったので、適切な(生成された)クラスインスタンスを作成することができます。それがJava APIで可能かどうかは分かりますか? –

+0

@ chin-huangを編集してくれてありがとう!あなたは私が質問をうまく言い換える手助けをしています。 Java APIを使用してこのスキーマを取得し、それを例えばSpecificDatumReaderに適用できるかどうかを知っていますか? –

+0

spring-cloud-stream-schemaはすでにそれを行っています。面白そうに見える – tan9

関連する問題