Apache Camel не останавливается и запрашивает строки базы данных несколько раз - PullRequest
0 голосов
/ 20 июня 2019

Я настраиваю конвейер от базы данных oracle (в которой есть таблица, содержащая столбец типа xml) до mongoDB, используя apache camel. Моя проблема заключается в том, что если я включаю значение 2000ms в thread.sleep (2000), маршрут перестает работать и отключается в середине строк опроса, я меняю это значение на Integer.MAX_VALUE, я обнаружил, что каждая строка добавлялась несколько раз в mongoDB , Я совершенно новичок в этой области, поэтому я подумал, что вы могли бы помочь с этим!

Вот верблюд-context.xml:

<camelContext id="camelContext-f0b5f69c-a9b5-434a-974b-6fe815aa3d06" 
 xmlns="http://camel.apache.org/schema/spring">
    <!-- here is a sample which processes the input files
     (leaving them in place - see the 'noop' flag)
     then performs content based routing on the message using XPath -->
    <threadPool id="myPool" maxPoolSize="25" maxQueueSize="200"
        poolSize="20" threadName="Cool"/>
    <route id="jdbc_connect"  streamCache="true">
        <from uri="timer://foo"/>
        <to id="_to3" uri="sql:SELECT * FROM Schema.Park ? 
dataSource=#dataSource&amp;outputType=StreamList"/>
        <split executorServiceRef="myPool" id="_split1"
            parallelProcessing="true" stopOnException="true" 
            streaming="true">
            <simple>${in.body}</simple>
            <process id="_process1" ref="rowProcessor"/>
            <unmarshal id="_unmarshal1">
                <jaxb contextPath="OracleMongo.Orcl.JAXB"/>
            </unmarshal>
            <marshal id="_marshal1">
                <json library="Gson"/>
            </marshal>
            <convertBodyTo id="_convertBodyTo1" type="String"/>
            <to id="_to2" uri="mongodb3:mongoBean? 
        database=test&amp;collection=Park&amp;operation=insert"/>
        </split>
    </route>
</camelContext>

Вот основной класс:

 public static final void main(String[] args) throws Exception {
    ApplicationContext appContext = new ClassPathXmlApplicationContext(
            "META-INF/spring/camel-context.xml");
    CamelContext camelContext = SpringCamelContext.springCamelContext(
            appContext, false);
    try {
        camelContext.start();
        Thread.sleep(Integer.MAX_VALUE);
    } finally {
        camelContext.stop();
    }
}

Вот что я получил, когда включил значение 2000ms в Thread.sleep:

 thread #2 - ShutdownTask] DefaultShutdownStrategy        INFO  Route: 
 jdbc_connect shutdown complete, was consuming from: timer://foo
 [                          main] DefaultShutdownStrategy        INFO  
 Graceful shutdown of 1 routes completed in 300 seconds
 [                          main] DefaultInflightRepository      WARN  
 Shutting down while there are still 11 inflight exchanges.

1 Ответ

1 голос
/ 20 июня 2019

Для того, чтобы ваш основной поток работал как демон, вы можете использовать утилиту класса Main, просто предоставив контекст:

public static void main(String[] args) throws Exception {
    org.apache.camel.spring.Main main = new org.apache.camel.spring.Main();
    main.setApplicationContextUri("META-INF/spring/camel-context.xml");
    main.run();
}

Это выполнит ваши маршруты, не беспокоясь о добавлении sleep(...)в вашей основной теме.Конечно, поскольку вы не знаете, когда закончится ваш маршрут, вы должны остановить его вручную (CTRL + C, чтобы подать сигнал в JVM), не зная, достаточно ли этого для вашего варианта использования.

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

<from uri="timer://foo?repeatCount=1"/>

Надеюсь, что это поможет.

...