在我们的应用程序中,生产者正在发送不同的数据类型,并且分区可能具有不同的数据类型对象,因为我们不想根据数据类型进行分区。
在kafka Streams中,我试图使用标头。 生产者将头添加到BytesObject并将数据推送到kafka。
标题是,特定的dataType(customObject)。 现在基于标头,我想解析反序列化在kafka流中接收到的BytesObject,但是我受到使用processorInterface的束缚,在这里我必须传递实际的反序列化器
有什么方法我不必事先指定反序列化,然后基于processorContext中的标头为接收到的记录进行反序列化
public class StreamHeaderProcessor extends AbstractProcessor<String, Bytes>{
@Override
public void process(String key, Bytes value) {
Iterator<Header> it = context().headers().iterator();
while(it.hasNext()) {
Header head = it.next();
if(head.key().equals("dataType")) {
String headerValue = new String(head.value());
if(headerValue.equals("X")) {
}else if(headerValue.equals("Y")) {
}
}
}
}
}
答案 0 :(得分:0)
如果您未在StreamsConfig
中设置Serdes且未在builder.stream(..., Consumed.with(/*Serdes*/))
上设置Serdes,则Kafka Streams默认将使用ByteArraySerde
,因此键和值将被复制到byte[]
中数组作为数据类型。 (与使用Processor API相似,并且不要在topology.addSource(...)
上设置Serde。)
因此,您可以在数据流上应用Processor
或Transformer
,检查标头并在自己的代码中调用相应的解串器。您需要提前知道所有可能的数据类型。
public class MyProcessor implements Processor {
// add corresponding deserializers for all expected types (eg, String)
private StringDeserializer stringDeserializer = new StringDeserializer();
// other methods omitted
void process(byte[] key, byte[] value) {
// inspect header
if (header.equals("StringType") {
// get `context` via `init()` method
String stringValue = stringDeserializer.deserialize(context.topic(), value);
// similar for `key`
// apply processing logic for String type
}
}
}