Apache camel Apache camel从卡夫卡到另一个卡夫卡主题的路由出错

Apache camel Apache camel从卡夫卡到另一个卡夫卡主题的路由出错,apache-camel,Apache Camel,我使用ApacheCamel来使用来自kafka主题的消息,然后处理该消息,在处理异常时,我将该消息重定向到另一个kafka主题,并以单独的路由处理该消息。所以我有一条如下的路线 from ("kafka1").process("someProcessor").end(); onException(Throwable.class).process(exchange->{exchange.getIn().setBody("Message wi

我使用ApacheCamel来使用来自kafka主题的消息,然后处理该消息,在处理异常时,我将该消息重定向到另一个kafka主题,并以单独的路由处理该消息。所以我有一条如下的路线

from ("kafka1").process("someProcessor").end();
onException(Throwable.class).process(exchange->{exchange.getIn().setBody("Message with error details")}).to("kafka2");
上面的代码实际上是用同一个卡夫卡(kafka1)发送错误消息

我通过在
onException
过程中设置
exchange.getIn().setHeader(KafkaConstants.TOPIC,“kafka2”)
解决了这个问题。这是预期的行为吗?为什么它会忽略卡夫卡2而使用卡夫卡1呢

  • 使用的camel版本-2.14.0

  • 卡夫卡端点URL:

  • 消费者:

    from("kafka:" + ("kafka.broker") + "?topic="
                + ("offer.kafka.topic")
                + "&zookeeperHost=" + ("kafka.zookeeper.host")
                + "&zookeeperPort=" + ("kafka.zookeeper.port")
                + "&groupId=" + ("offer.kafka.group.id")
                + "&consumerStreams=" + ("kafka.streams")
                + "&autoCommitIntervalMs=" + ("product.kafka.consumer.auto.commit.intervals")
                + "&zookeeperConnectionTimeoutMs=" + ("zookeeper.connection.timeout")
                + "&rebalanceMaxRetries=" + ("kafka.rebalance.max.retries")
                + "&rebalanceBackoffMs=" + ("kafka.rebalance.backoffs.ms")
                + "&zookeeperSessionTimeoutMs=" + ("zookeeper.session.timeout")
                + "&autoOffsetReset=" + ("kafka.auto.offset.reset")
                + "&fetchMessageMaxBytes=" + ("kafka.fetch.message.max.bytes")
                + "&socketReceiveBufferBytes=" + ("receive.buffer.bytes"))
                .routeId("offerEventRoute").to("direct:offerEventRoute");
    
    制作人:

    to("kafka:" + ("error.kafka.broker") + "?topic="
                            + ("error.kafka.topic")
                            + "&zookeeperHost=" + ("error.kafka.zookeeper.host")
                            + "&zookeeperPort=" + ("error.kafka.zookeeper.port")
                            + "&groupId=" + ("error.kafka.group.id")
                            + "&zookeeperConnectionTimeoutMs=" + ("error.zookeeper.connection.timeout")
                            + "&rebalanceMaxRetries=" + ("rebalance.max.retries")
                            + "&rebalanceBackoffMs=" + ("rebalance.backoffs.ms")
                            + "&zookeeperSessionTimeoutMs=" + ("zookeeper.session.timeout")
                            + "&autoOffsetReset=" + ("auto.offset.reset")
                            + "&messageSendMaxRetries=" + ("error.max.retries")
                            + "&serializerClass=kafka.serializer.StringEncoder"
            );
    

    你能提供更多关于代码的细节吗

    1) 使用的驼峰版本

    2) 您的Kafka端点URL


    您是否在端点URL中使用了“bridgeEndpoint”属性?

    您需要在producer kafka端点中将bridgeEndpoint设置为true。否则,它会在exchange标头中查找主题名称,并将其用作生产者的主题名称


    默认为false。

    谢谢Himanshu,我更新了描述中的所有详细信息