Apache верблюд, как реализовать дополнительный потребитель для проволоки - PullRequest
0 голосов
/ 03 января 2019

Я настроил несколько маршрутов (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 является необязательным компонентом, все приложение будет работать без него.

Я использую Mongo'S ServerMonitorListener , чтобы проверить, доступен ли Mongo. Я приостанавливаю или возобновляю маршрут, используя 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
...

Почему производитель блокирует? Значение по умолчанию для «блока» должно быть ложным ?! И после этого мы видим, конечно, исключение:

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

Как лучше всего позволить верблюду немедленно отказаться от обмена (как установить время ожидания) и не выдавать никаких исключений (потому что это нормальное поведение приложения, исключение будет только замедляться)?

UPDATE: вот полное исключение:

[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]

1 Ответ

0 голосов
/ 05 января 2019

Обязательно проверьте документ на используемую вами версию Camel, а именно 2.22.x

Там вы видите, что блок включен по умолчанию: https://github.com/apache/camel/blob/camel-2.22.x/camel-core/src/main/docs/direct-component.adoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...