Рекурсивный вызов в Camel - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть проект с Camel, и у моего маршрута есть рекурсивный вызов, чтобы реализовать logi c «вызов хранимой процедуры, когда он возвращает набор данных»:

<route id="trxnReader">
    <from uri="direct:query"/>

    <to uri="sql-stored:classpath:sql/getTrxnsProcedure.sql?dataSource=myDataSource"
        id="storedprocGetTrxns"/>

    <choice>
        <when>
            <simple>${body} != null</simple>

            <split>
                <simple>${body.transactions}</simple>
                <filter>
                    <method ref="trnxFilter" method="filter"/>
                    <to uri="direct:processTrxn"/>
                </filter>
            </split>

            <to uri="direct:query"/>
        </when>
        <otherwise>
            <log id="failUploadInfo" message="Transactions don't exist" loggingLevel="INFO"/>
        </otherwise>
    </choice>
</route>

Проблема с этот код состоит в том, что если моя хранимая процедура постоянно возвращает что-то в течение длительного времени, не позволяя выйти из рекурсии, я получаю java.lang.StackOverflowError. Мне нужно что-то вроде l oop. Как лучше всего реализовать такие логи c с Camel? Я использую Camel 2.15.3.

1 Ответ

0 голосов
/ 05 февраля 2020

Я нашел обходной путь с пользовательским компонентом и выходным условием l oop (свойство isLoopDone)

public class LoopBean {

    @Handler
    public void loop(@ExchangeProperty("loopEndpoint") String endpoint, Exchange exchange) {
        ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate();
        boolean isLoopDone = false;
        Exchange currentExchange = exchange;

        do {
            currentExchange = producerTemplate.send(endpoint, currentExchange);
            Object isLoopDoneProperty = currentExchange.getProperty("isLoopDone");
            if (isLoopDoneProperty != null) {
                isLoopDone = (boolean) isLoopDoneProperty;
            }
        }
        while (!isLoopDone);
    }
}
<route id="trxnReader">
    <from uri="direct:query"/>
    <setProperty propertyName="loopEndpoint">
        <simple>direct:callStoredProcWhileItHasTransactions</simple>
    </setProperty>

    <bean ref="loopBean"/>
</route>

<route id="storedProcCallingLoop">
    <from uri="direct:callStoredProcWhileItHasTransactions"/>

    <to uri="sql-stored:classpath:sql/getTrxnsProcedure.sql?dataSource=myDataSource"
        id="storedprocGetTrxns"/>

    <choice>
        <when>
            <simple>${body} != null</simple>

            <split>
                <simple>${body.transactions}</simple>
                <filter>
                    <method ref="trnxFilter" method="filter"/>
                    <to uri="direct:processTrxn"/>
                </filter>
            </split>
        </when>
        <otherwise>
            <log id="failUploadInfo" message="Transactions don't exist" loggingLevel="INFO"/>
            <setProperty propertyName="isLoopDone">
                <simple resultType="java.lang.Boolean">true</simple>
            </setProperty>
        </otherwise>
    </choice>
</route>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...