![](/img/trans.png)
[英]Deserializing different JSON payload from same Kafka topic with Spring Kafka
[英]spring kafka : different json payload on the same topic
我需要在同一Kafka主题(例如Foo,Bar,Car ...)上发送不同的JSON有效负载,而不使用父类
基于spring kafka文档,我可以在类级别使用@KafkaListener
,并在方法级别( doc )指定@KafkaHandler
@KafkaListener(topics = "myTopic")
static class MultiListenerBean {
@KafkaHandler
public void listen(Foo foo) {
...
}
@KafkaHandler
public void listen(Bar bar) {
...
}
@KafkaHandler
public void listen(Car car) {
...
}
}
但我得到这个例外:
[org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] ERROR o.s.k.listener.LoggingErrorHandler - Error while processing: ConsumerRecord(topic = myTopic, partition = 1, offset = 0, CreateTime = 1508859519287, checksum = 3297149058, serialized key size = -1, serialized value size = 13, key = null, value = {"foo":"foo"})
org.springframework.kafka.KafkaException: No method found for class java.util.LinkedHashMap
at org.springframework.kafka.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:92)
at org.springframework.kafka.listener.adapter.DelegatingInvocableHandler.getMethodNameFor(DelegatingInvocableHandler.java:147)
at org.springframework.kafka.listener.adapter.HandlerAdapter.getMethodAsString(HandlerAdapter.java:60)
at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:188)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:72)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:47)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:794)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:738)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:570)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
我也尝试过这种方法,但是不起作用:
@KafkaListener(topics = "myTopic")
public void receive(ConsumerRecord<String, ?> payload)
{
if (payload.value() instanceof Foo)
{
//
}
else if (payload.value() instanceof Car)
{
//
}
}
如何使用Spring Kafka配置生产者和使用者在同一主题上发送不同的JSON有效负载?
使用JSON和多方法侦听器时有22个陷阱。 我们需要知道路由到正确方法的类型; 我们无法从方法签名中推断要转换的类型,因为我们尚不知道要调用哪个方法。
您需要一个消息转换器,该转换器可以从数据或使用Header
(与Kafka 11一起)中找出类型。
然后,在将转换器转换为正确的类型之后,我们可以找出要调用的方法。
第二次尝试, ConsumerRecord
将包含原始JSON; 您将需要使用ObjectMapper
进行转换,但是再次,您将需要一些提示,提示您要将转换为哪种类型(或以蛮力操作,直到成功)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.