kafka-streams中的ClassCastException连接

时间:2017-08-25 14:34:56

标签: scala stream apache-kafka apache-kafka-streams

我想要合并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方法中使用OrderCreationRequest而不是join)我可以看到OrderPayment的两个参数都有ValueJoiner.apply的相同值{1}}。为什么会这样?我错过了什么吗?

注意:如果我打印2个流的内容,我会得到预期的数据,所以我确定这些主题不包含相同的数据。

谢谢!

0 个答案:

没有答案