繁体   English   中英

卡夫卡流中的ClassCastException加入

[英]ClassCastException in kafka-streams join

我有2个要合并的kafka流。 它们每个都被键入,并包含正确的数据:

private val inputOrderStream: KStream[String, OrderCreationRequest] =
    orderCreationRequestBuilder
      .stream[OrderCreationRequestKey, OrderCreationRequest]("order-creation-request-topic")
      .map[String, OrderCreationRequest]((key: OrderCreationRequestKey, orderCreationRequest: OrderCreationRequest) ⇒ new KeyValue(key.id, orderCreationRequest))

private val inputPaymentStream: KStream[String, OrderPayment] =
   orderPaymentBuilder
      .stream[OrderPaymentKey, OrderPayment]("payment-topic")
      .map[String, OrderPayment]((key: OrderPaymentKey, orderPayment: OrderPayment) ⇒ new KeyValue(key.id, orderPayment))

当我尝试通过bey加入时,我得到一个非常混乱的java.lang.ClassCastException

 java.lang.ClassCastException: com.ordercreation.OrderPayment cannot be cast to com.ordercreation.OrderCreationRequest
    at com.ordercreation.streams.Streams$$anon$1.apply(Streams.scala:48)
    at org.apache.kafka.streams.kstream.internals.AbstractStream$1.apply(AbstractStream.java:71)
    at org.apache.kafka.streams.kstream.internals.KStreamKStreamJoin$KStreamKStreamJoinProcessor.process(KStreamKStreamJoin.java:82)
    at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:47)
    at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:187)
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:133)
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:82)
    at org.apache.kafka.streams.kstream.internals.KStreamJoinWindow$KStreamJoinWindowProcessor.process(KStreamJoinWindow.java:63)
    at org.apache.kafka.streams.processor.internals.ProcessorNode$1.run(ProcessorNode.java:47)
    at org.apache.kafka.streams.processor.internals.StreamsMetricsImpl.measureLatencyNs(StreamsMetricsImpl.java:187)
    at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:133)
    at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:82)
    at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:80)
    at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:189)
    at org.apache.kafka.streams.processor.internals.StreamThread.processAndPunctuate(StreamThread.java:679)
    at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:557)
    at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:527)

这是联接代码:

 private val outputStream: KStream[String, String] =
    inputPaymentStream
      .join[OrderCreationRequest, String](
        inputOrderStream,
        new ValueJoiner[OrderPayment, OrderCreationRequest, String] {
          override def apply(op: OrderPayment, ocr: OrderCreationRequest): String = s"Payed ${op.amountInCents} via ${op.method} on behalf of ${ocr.customerNumber}."
        },
        window,
        Serdes.String(),
        null,
        null)

调查多一点(使用AnyRef而不是OrderCreationRequestjoin法)我可以看到的相同值OrderPayment给予的两个参数ValueJoiner.apply 为什么会这样呢? 我有什么想念的吗?

注意:如果我打印两个流的内容,则会得到预期的数据,因此我确定主题不包含相同的数据。

谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM