R - the subtype of ConnectRecord on which this transformation will operatepublic class ByLogicalTableRouter<R extends org.apache.kafka.connect.connector.ConnectRecord<R>> extends Object implements org.apache.kafka.connect.transforms.Transformation<R>
TOPIC_REGEX and TOPIC_REPLACEMENT are used
to change the record's topic.
Now that multiple physical tables can share a topic, the event's key may need to be augmented to include fields other
than just those for the record's primary/unique key, since these are not guaranteed to be unique across tables. We
need some identifier added to the key that distinguishes the different physical tables. The field name specified by
the config option KEY_FIELD_NAME is added to the key schema for this purpose. By default, its value will
be the old topic name, but if a custom value is desired, the config options KEY_FIELD_REGEX and
KEY_FIELD_REPLACEMENT may be used to change it. For instance, in our above example, we might choose to
make the identifier `db_shard1` and `db_shard2` respectively.| Modifier and Type | Field and Description |
|---|---|
private org.apache.kafka.common.cache.Cache<org.apache.kafka.connect.data.Schema,org.apache.kafka.connect.data.Schema> |
envelopeSchemaUpdateCache |
private static Field |
KEY_FIELD_NAME |
private static Field |
KEY_FIELD_REGEX |
private static Field |
KEY_FIELD_REPLACEMENT |
private String |
keyFieldName |
private Pattern |
keyFieldRegex |
private String |
keyFieldReplacement |
private org.apache.kafka.common.cache.Cache<String,String> |
keyRegexReplaceCache |
private org.apache.kafka.common.cache.Cache<org.apache.kafka.connect.data.Schema,org.apache.kafka.connect.data.Schema> |
keySchemaUpdateCache |
private static org.slf4j.Logger |
logger |
private SchemaNameAdjuster |
schemaNameAdjuster |
private static Field |
TOPIC_REGEX |
private static Field |
TOPIC_REPLACEMENT |
private Pattern |
topicRegex |
private org.apache.kafka.common.cache.Cache<String,String> |
topicRegexReplaceCache |
private String |
topicReplacement |
| Constructor and Description |
|---|
ByLogicalTableRouter() |
| Modifier and Type | Method and Description |
|---|---|
R |
apply(R record) |
void |
close() |
org.apache.kafka.common.config.ConfigDef |
config() |
void |
configure(Map<String,?> props) |
private org.apache.kafka.connect.data.SchemaBuilder |
copySchemaExcludingName(org.apache.kafka.connect.data.Schema source,
org.apache.kafka.connect.data.SchemaBuilder builder) |
private org.apache.kafka.connect.data.SchemaBuilder |
copySchemaExcludingName(org.apache.kafka.connect.data.Schema source,
org.apache.kafka.connect.data.SchemaBuilder builder,
boolean copyFields) |
private String |
determineNewTopic(String oldTopic)
Determine the new topic name.
|
private org.apache.kafka.connect.data.Struct |
updateEnvelope(org.apache.kafka.connect.data.Schema newEnvelopeSchema,
org.apache.kafka.connect.data.Struct oldEnvelope) |
private org.apache.kafka.connect.data.Schema |
updateEnvelopeSchema(org.apache.kafka.connect.data.Schema oldEnvelopeSchema,
String newTopicName) |
private org.apache.kafka.connect.data.Struct |
updateKey(org.apache.kafka.connect.data.Schema newKeySchema,
org.apache.kafka.connect.data.Struct oldKey,
String oldTopic) |
private org.apache.kafka.connect.data.Schema |
updateKeySchema(org.apache.kafka.connect.data.Schema oldKeySchema,
String newTopicName) |
private org.apache.kafka.connect.data.Struct |
updateValue(org.apache.kafka.connect.data.Schema newValueSchema,
org.apache.kafka.connect.data.Struct oldValue) |
private static int |
validateKeyFieldReplacement(Configuration config,
Field field,
Field.ValidationOutput problems)
If KEY_FIELD_REGEX has a value that is really a regex, then the KEY_FIELD_REPLACEMENT must be a non-empty value.
|
private static final Field TOPIC_REGEX
private static final Field TOPIC_REPLACEMENT
private static final Field KEY_FIELD_REGEX
private static final Field KEY_FIELD_NAME
private static final Field KEY_FIELD_REPLACEMENT
private static final org.slf4j.Logger logger
private final SchemaNameAdjuster schemaNameAdjuster
private Pattern topicRegex
private String topicReplacement
private Pattern keyFieldRegex
private String keyFieldReplacement
private String keyFieldName
private final org.apache.kafka.common.cache.Cache<org.apache.kafka.connect.data.Schema,org.apache.kafka.connect.data.Schema> keySchemaUpdateCache
private final org.apache.kafka.common.cache.Cache<org.apache.kafka.connect.data.Schema,org.apache.kafka.connect.data.Schema> envelopeSchemaUpdateCache
private final org.apache.kafka.common.cache.Cache<String,String> keyRegexReplaceCache
private static int validateKeyFieldReplacement(Configuration config, Field field, Field.ValidationOutput problems)
public void configure(Map<String,?> props)
configure in interface org.apache.kafka.common.Configurablepublic void close()
public org.apache.kafka.common.config.ConfigDef config()
private String determineNewTopic(String oldTopic)
oldTopic - the name of the old topicprivate org.apache.kafka.connect.data.Schema updateKeySchema(org.apache.kafka.connect.data.Schema oldKeySchema,
String newTopicName)
private org.apache.kafka.connect.data.Struct updateKey(org.apache.kafka.connect.data.Schema newKeySchema,
org.apache.kafka.connect.data.Struct oldKey,
String oldTopic)
private org.apache.kafka.connect.data.Schema updateEnvelopeSchema(org.apache.kafka.connect.data.Schema oldEnvelopeSchema,
String newTopicName)
private org.apache.kafka.connect.data.Struct updateEnvelope(org.apache.kafka.connect.data.Schema newEnvelopeSchema,
org.apache.kafka.connect.data.Struct oldEnvelope)
private org.apache.kafka.connect.data.Struct updateValue(org.apache.kafka.connect.data.Schema newValueSchema,
org.apache.kafka.connect.data.Struct oldValue)
private org.apache.kafka.connect.data.SchemaBuilder copySchemaExcludingName(org.apache.kafka.connect.data.Schema source,
org.apache.kafka.connect.data.SchemaBuilder builder)
private org.apache.kafka.connect.data.SchemaBuilder copySchemaExcludingName(org.apache.kafka.connect.data.Schema source,
org.apache.kafka.connect.data.SchemaBuilder builder,
boolean copyFields)
Copyright © 2020 JBoss by Red Hat. All rights reserved.