スキーマ情報の指定

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: JSON
message-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 スキーマ型でのみサポートされます。