com.networknt.kafka.producer.SchemaManager Maven / Gradle / Ivy
Show all versions of kafka-producer Show documentation
/*
* Copyright 2021 Confluent Inc.
*
* Licensed under the Confluent Community License (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the
* License at
*
* http://www.confluent.io/confluent-community-license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.networknt.kafka.producer;
import io.confluent.kafka.serializers.subject.strategy.SubjectNameStrategy;
import com.networknt.kafka.entity.EmbeddedFormat;
import java.util.Optional;
/**
* A manager for Schema Registry {@link RegisteredSchema schemas}.
*/
public interface SchemaManager {
/**
* Returns a {@link RegisteredSchema schema} matching the parameter options.
*
* There are two pieces of information required to get an schema: the subject to which the
* schema is/should be registered, and a schema identifier (or schema itself).
*
*
The first bit is handled by {@code subject} and {@code subjectNameStrategy}, which are
* mutually exclusive. If {@code subject} is passed, that's the subject used. If {@code
* subjectNameStrategy} is passed instead, then it will be used to generate the subject. All
* strategies (TOPIC_NAME, RECORD_NAME and TOPIC_RECORD_NAME) are valid if using {@code schemaId}
* or {@code rawSchema}, but only TOPIC_NAME is valid for everything else. If neither {@code
* subject} or {@code subjectNameStrategy} are passed, a default strategy is used based off the
* configs {@code schema.registry.key.subject.name.strategy} and {@code
* schema.registry.value.subject.name.strategy}. The same considerations above apply for which
* default strategies are valid.
*
*
The second bit is handled by {@code schemaId}, {@code schemaVersion} and {@code rawSchema},
* which are mutually exclusive. If {@code schemaId} is passed, that schema is going to be used,
* but only if the subject (see previous paragraph) contains a version mapped to that schema ID.
* If {@code schemaVersion} is used, then that version of subject is going to be used. If {@code
* rawSchema} is used, a new version with that schema is going to be registered in the subject,
* unless the subject already has a version with exactly the same schema, in which case no new
* version is registered and that version is used instead. If neither {@code schemaId}, {@code
* schemaVersion} or {@code rawSchema} are passed, the latest version of the subject is used.
*
*
If passing {@code rawSchema}, {@code format} is mandatory. {@code format} is otherwise
* illegal to be passed.
*
*
Schema Registry is not very descriptive as for error causes, so non-existing subject, schema
* ID or schema version will result in {@link
* org.apache.kafka.common.errors.SerializationException}, as it will any other Schema Registry
* related error. Invalid combination of options will result in {@link IllegalArgumentException}.
* @return RegisteredSchema
* @param topicName the topic name
* @param format the format
* @param subject the subject
* @param subjectNameStrategy subject name strategy
* @param schemaId schema id
* @param schemaVersion schema version
* @param rawSchema raw schema
* @param isKey indicator if it is the key
*/
RegisteredSchema getSchema(
String topicName,
Optional format,
Optional subject,
Optional subjectNameStrategy,
Optional schemaId,
Optional schemaVersion,
Optional rawSchema,
boolean isKey);
}