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

时间:2015-12-15 02:08:39

标签: apache-camel

我正在使用Apache Camel来消费来自kafka主题的消息,然后处理消息,同时处理如果发生异常,我将该消息重定向到另一个kafka主题并在单独的路由中处理该消息。所以我的路线如下。

from(&#34; kafka1&#34;)。process(&#34; someProcessor&#34;)。end(); onException(Throwable.class).process(exchange-&gt; {exchange.getIn()。setBody(&#34; Message with error details&#34;)})。to(&#34; kafka2&#34;); < / p>

上面的代码实际上是在同一个kafka(kafka1)中发送错误消息。

我通过在onException进程中设置exchange.getIn()。setHeader(KafkaConstants.TOPIC,&#34; kafka2&#34;))来解决这个问题。这是预期的行为吗?为什么它会忽略kafka2并使用kafka1呢?

1)使用的骆驼版本 - 2.14.0

2)Kafka端点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"
        );

2 个答案:

答案 0 :(得分:2)

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

默认情况下为false。

答案 1 :(得分:0)

您能否提供有关代码的更多详细信息,

1)使用骆驼的版本

2)您的Kafka端点URL。

你有没有机会使用&#39; bridgeEndpoint&#39;端点URL中的属性..