【问题标题】:Apache camel how to implement an optional consumer for a wire tapApache骆驼如何为窃听器实现可选的消费者
【发布时间】:2019-01-07 17:24:29
【问题描述】:

我设置了一些路由(Camel 2.22.1),它们使用窃听器将一些内容记录到 Mongo 数据库中。

from(DIRECT_NEXT).process(sendFile)
        .wireTap( "direct:count-fetch?failIfNoConsumers=false" )

如您所见,我正在使用 failIfNoConsumers=false

from(COUNT_FETCH)
        .routeId( MONGO_COUNT_FETCH_ROUTEID )
        .autoStartup( false )
        .process(countFetchProcessor)
        .to(persistenceEndpoints.updateImage())
        .log(LoggingLevel.DEBUG, "Counted fetch.");

mongo DB 是一个可选组件,没有它整个应用程序都将运行。

我正在使用 Mongo 的 ServerMonitorListener 来检查 Mongo 是否可用。我相应地使用 Camel 的 ControlBus 暂停或恢复溃败。

一切正常! 我的问题是 Camel 尝试将交换发送到 30 秒内未运行的路线:

...
[DEBUG] 2019-01-03 14:02:45.848 [Camel (camel-1) thread #23 - WireTap] DirectBlockingProducer - Waited 20025 for consumer to be ready
...

为什么生产者会阻塞? “block”的默认值应该是false?! 在它之后我们当然会看到一个例外:

 No consumers available on endpoint: direct://count-fetch?failIfNoConsumers=false

让骆驼立即丢弃交换的最佳方法是什么(如何设置超时?)并且不抛出任何异常(因为这是正常的应用程序行为,异常只会减慢速度)?

更新: 这是完整的例外:

[ERROR] 2019-01-07 10:21:22.702 [Camel (camel-1) thread #4 - WireTap] DefaultErrorHandler - Failed delivery for (MessageId: ID-moritz-1546852848013-0-3 on ExchangeId: ID-moritz-1546852848013-0-2). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://update-all?failIfNoConsumers=false. Exchange[ID-moritz-1546852848013-0-2]

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route4            ] [route4            ] [timer://updateAll                                                             ] [     30065]
[route4            ] [log1              ] [log                                                                           ] [         1]
[route4            ] [to3               ] [direct:updateAll                                                              ] [        19]
[route5            ] [process2          ] [Processor@0x4e92466a                                                          ] [         9]
[route5            ] [process3          ] [Processor@0x1b29d52b                                                          ] [         7]
[route5            ] [wireTap1          ] [wireTap[direct:update-all?failIfNoConsumers=false]                            ] [         1]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://update-all?failIfNoConsumers=false. Exchange[ID-moritz-1546852848013-0-2]
    at org.apache.camel.component.direct.DirectBlockingProducer.getConsumer(DirectBlockingProducer.java:67) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.component.direct.DirectBlockingProducer.process(DirectBlockingProducer.java:53) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.SendDynamicProcessor$1.doInAsyncProducer(SendDynamicProcessor.java:178) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:445) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:160) ~[camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) [camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) [camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.WireTapProcessor$1.call(WireTapProcessor.java:160) [camel-core-2.22.1.jar:2.22.1]
    at org.apache.camel.processor.WireTapProcessor$1.call(WireTapProcessor.java:155) [camel-core-2.22.1.jar:2.22.1]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    请务必检查文档,了解您使用的 Camel 版本,即 2.22.x

    您可以看到该块默认启用:https://github.com/apache/camel/blob/camel-2.22.x/camel-core/src/main/docs/direct-component.adoc

    【讨论】:

    • thx @claus 这也解释了为什么通过设置 failIfNoConsumers=false 没有改变(它也是默认设置的) - 但为什么我仍然看到交换失败异常 - 因为缺少消费者? (我希望它等待,但我不希望引发异常。)
    • 感谢您的建议。这是直接端点中的错误吗?我应该开票吗?
    • 是的,它闻起来像一个错误,欢迎您登录 JIRA。似乎在 master 分支上工作,您也可以尝试升级到 Camel 2.23.0
    • 也尝试使用最新的 2.22.x 版本,例如 2.22.2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2015-08-27
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多