スキーマ情報の指定
Java プリミティブ型を使用する場合、フレームワークによってスキーマが自動検出されるため、データを公開するためにスキーマ型を指定する必要はありません。非プリミティブ型の場合、PulsarTemplate で送信操作を呼び出すときにスキーマが明示的に指定されていない場合、Spring for Apache Pulsar フレームワークはその型から Schema.JSON を構築しようとします。
| 現在サポートされている複雑なスキーマ型は、INLINE エンコードを使用した JSON、AVRO、PROTOBUF、AUTO_PRODUCE_BYTES、KEY_VALUE です。 |
カスタムスキーママッピング
PulsarTemplate で複合型の送信操作を呼び出すときにスキーマを指定する代わりに、型のマッピングを使用してスキーマリゾルバーを構成できます。これにより、フレームワークが送信メッセージ型を使用してリゾルバーに問い合わせるため、スキーマを指定する必要がなくなります。
構成プロパティ
スキーママッピングは、spring.pulsar.defaults.type-mappings プロパティを使用して構成できます。次の例では、application.yml を使用して、それぞれ AVRO スキーマと JSON スキーマを使用する User および Address 複合オブジェクトのマッピングを追加します。
spring:
pulsar:
defaults:
type-mappings:
- message-type: com.acme.User
schema-info:
schema-type: AVRO
- message-type: com.acme.Address
schema-info:
schema-type: JSONmessage-type は、メッセージクラスの完全修飾名です。 |
スキーマリゾルバーカスタマイザー
マッピングを追加する推奨される方法は、上記のプロパティを使用することです。ただし、より詳細な制御が必要な場合は、スキーマリゾルバーカスタマイザーを提供してマッピングを追加できます。
次の例では、スキーマリゾルバーカスタマイザーを使用して、AVRO スキーマと JSON スキーマをそれぞれ使用する User および Address 複合オブジェクトのマッピングを追加します。
@Bean
public SchemaResolverCustomizer<DefaultSchemaResolver> schemaResolverCustomizer() {
return (schemaResolver) -> {
schemaResolver.addCustomSchemaMapping(User.class, Schema.AVRO(User.class));
schemaResolver.addCustomSchemaMapping(Address.class, Schema.JSON(Address.class));
}
}型マッピングのアノテーション
特定のメッセージ型に使用するデフォルトのスキーマ情報を指定するためのもう 1 つのオプションは、メッセージクラスに @PulsarMessage アノテーションをマークすることです。スキーマ情報は、アノテーションの schemaType 属性を介して指定できます。
次の例では、Foo 型のメッセージを生成または消費するときに、デフォルトのスキーマとして JSON を使用するようにシステムを構成します。
@PulsarMessage(schemaType = SchemaType.JSON)
record Foo(String value) {
}この構成を使用すると、送信操作時にスキーマを設定指定する必要はありません。
AUTO_SCHEMA を使用した生産
Pulsar トピックのスキーマの種類を事前に知る機会がない場合は、AUTO_PRODUCE [Apache] (英語) スキーマを使用して、生の JSON または Avro ペイロードを byte[] として安全に公開できます。
この場合、プロデューサーは、送信バイトが宛先トピックのスキーマと互換性があるかどうかを検証します。
以下の例に示すように、テンプレートの送信操作で Schema.AUTO_PRODUCE_BYTES() のスキーマを指定するだけです。
void sendUserAsBytes(PulsarTemplate<byte[]> template, byte[] userAsBytes) {
template.send("user-topic", userAsBytes, Schema.AUTO_PRODUCE_BYTES());
}| これは、Avro および JSON スキーマ型でのみサポートされます。 |