Как настроить apache camel, чтобы увидеть причину выключения?

Предварительные условия:

Верблюд 2.17

Я определил несколько маршрутов, которые содержат такие записи, как:

.to ("log:org.apache.camel?level=DEBUG")

Моя конфигурация журнала содержит:

<logger name="org.apache.camel" level="TRACE" />

Определение контекста начинается с:

<camel:camelContext id="someContext" ... trace="true">

Когда я запускаю Camel, я вижу, что Camel продолжает работать и, наконец, без ЛЮБОГО сообщения об ошибке просто закрывается. Это выглядит так:

2016-10-04 13:40:56,146 [localhost-startStop-1] TRACE org.apache.camel.model.ProcessorDefinitionHelper - There are 6 properties on: From[direct:process]
2016-10-04 13:40:58,042 [localhost-startStop-1] DEBUG org.apache.camel.spring.SpringCamelContext - onApplicationEvent: org.springframework.context.event.ContextClosedEvent[source=Root WebApplicationContext: startup date [Tue Oct 04 13:37:25 CEST 2016]; root of context hierarchy]
2016-10-04 13:40:58,066 [localhost-startStop-1] INFO  org.apache.camel.spring.SpringCamelContext - Apache Camel 2.17.3 (CamelContext: someContext) is shutting down

у меня так же:

    onException( java.lang.Exception.class )
            .handled( false )
            .to( "log:GeneralError?level=ERROR" );

Но это больше связано с обработкой обмена, а не с запуском.

Есть ли общий способ проверить, что там происходит? Например:

  • Отсутствует ли какой-либо класс и происходит сбой загрузчика классов?
  • Или выбрасывается какое-то исключение?
  • Или какое-то соединение не работает?

Полное определение маршрута:

final RouteDefinition kafkaRouteDefinition = from( "kafka:{{kafka.broker.endpoints}}" +
        "?topic={{kafka.topic.name}}" +
        "&groupId=my_group" +
        "&autoOffsetReset=earliest" +
        "&consumersCount={{kafka.consumer.count}}" );

LOG.info( "Kafka route definition: " + kafkaRouteDefinition.toString() );

kafkaRouteDefinition
        .routeId( Constants.ROUTE_ID_PROCESS_KAFKA_MESSAGES )
        .to( "log:org.apache.camel?level=DEBUG" )
        .process( new RawMessageProcessor() ).id( RawMessageProcessor.class.getSimpleName() )
        .to( "log:org.apache.camel?level=DEBUG" )
        .unmarshal( inputMessageFormat ).id( "ConvertRawMessageToLogline" )
        .to( "log:org.apache.camel?level=DEBUG" )
        .process( new LoglineMessageProcessor() ).id( LoglineMessageProcessor.class.getSimpleName() )
        .to( "log:org.apache.camel?level=DEBUG" )
        .to( Constants.CAMEL_PROCESS_ENDPOINT )
        .to( "log:org.apache.camel?level=DEBUG" )
        .multicast().stopOnException()
        .to( "log:org.apache.camel?level=DEBUG" )
        .to( Constants.CAMEL_STORE_ENDPOINT
                , Constants.CAMEL_INDEX_ENDPOINT
        )
        .to( "log:org.apache.camel?level=DEBUG" )
        .end();

person Seweryn Habdank-Wojewódzki    schedule 04.10.2016    source источник


Ответы (1)


У меня была похожая проблема [но я использовал Spring]

Это происходит, когда основной метод, который загружает контекст верблюда, завершается до полной загрузки контекста верблюда.

Добавьте приведенный ниже код в свой тестовый пример, и он должен работать

org.apache.camel.spring.Main main = new Main();
main.setApplicationContextUri("camel-context.xml");
main.start();
Thread.sleep(1000);

Более того, вы также можете остановить автозапуск и запустить контекст верблюда позже, когда это необходимо.

<camelContext id="myCamel" xmlns="http://camel.apache.org/schema/spring" autoStartup="false">
    <route>
        <from uri="direct:start"/>
        <to uri="mock:result"/>
    </route>
</camelContext>

затем в каком-то java-файле

ApplicationContext ac = ...
SpringCamelContext camel = (SpringCamelContext) ac.getBean("myCamel");

// now start Camel manually
camel.start();
person Ashish    schedule 05.10.2016
comment
У меня более менее всего этого. Проблема в многословии верблюда. Он ест исключения или другие отчеты об ошибках, даже не записывая их в журналы. Иногда в некоторых журналах уровня TRACE я вижу, что, например. параметр равен нулю или около того. Затем в другой строке журнала я вижу выключение или остановку или что-то еще - обычно совершенно непонятно. Я ожидаю увидеть, по крайней мере, конкретные сообщения уровня WARN, такие как ожидаемый тип/значение: String got int. Верблюд выключится. При таком репортаже я вижу связь между причиной и следствием. - person Seweryn Habdank-Wojewódzki; 07.10.2016
comment
создайте log4j.xml с режимом отладки в файле. Вы должны получить каждый шаг там - person Ashish; 07.10.2016
comment
@Aschish: Я сделал это, это не слишком помогает. Я также добавил в построитель маршрутов: onException( java.lang.Exception.class ).handled( false ).to( "log:GeneralError?level=ERROR" );, но это тоже не очень помогает. Возможно, я ошибаюсь, но я сделал обзор кода плагина Kafka Camel и вижу, что в нем очень мало обработки исключений. Возможно, проблемы отправляются на более высокий уровень. - person Seweryn Habdank-Wojewódzki; 11.10.2016
comment
Поделитесь полным маршрутом. У меня была такая же проблема раньше, когда ведение журнала было неправильным, так как я использовал Spring, я использовал <bean id="camelTracer" class="org.apache.camel.processor.interceptor.Tracer"> <property name="traceExceptions" value="false"/> <property name="traceInterceptors" value="true"/> <property name="logLevel" value="ERROR"/> <property name="logName" value="com.mycompany.messages"/> </bean>, и он записывает все - person Ashish; 11.10.2016
comment
Я расширил содержание вопроса. - person Seweryn Habdank-Wojewódzki; 11.10.2016
comment
Я не могу дать вам похвалу за ответ из-за моей низкой репутации. Ваш последний комментарий великолепен! Я хотел бы только здесь описать Tracer Interceptor: camel.apache.org/tracer.html< /а> - person Seweryn Habdank-Wojewódzki; 12.10.2016
comment
Можете ли вы добавить свой пример перехватчика в ответ, пожалуйста. - person Seweryn Habdank-Wojewódzki; 12.10.2016