Как остановить верблюжий цикл - PullRequest
0 голосов
/ 11 июня 2018

У нас есть независимый пакет, создающий фабричные детали на основе нескольких переменных заголовка [direct-vm: createPartService].

Моему приложению нужно пройтись по списку деталей и периодически вызывать этот комплект.Мой метод partBean.update просто извлекает информацию о детали из списка деталей, настраивает переменные заголовка, а затем вызывает createPartService.

Я использую следующий цикл doWhile.Я нахожу, что когда возвращаемое состояние createPartService имеет статус ОШИБКА, следующий цикл работает отлично.Рабочий процесс выходит из цикла и переходит в раздел обработки исключений.Но, когда возвращаемое состояние createPartService никогда не ошибается, т. Е. Каждый createPartService является SUCCESS, цикл while никогда не останавливается.

        <loop doWhile="true">
          <simple>${header.STATUS} == 'SUCCESS'</simple>              
          <bean ref="partBean" method="update"/>
          <to uri="direct-vm:createPartService"/>
            <choice>
                <when>
                    <simple>${header.STATUS} == 'ERROR'</simple>
                    <throwException exceptionType="java.lang.Exception message="${header.ERROR_MESSAGE}"/>
                    <to uri="mock:endPartsError"/>
                </when>
                <otherwise>
                    <log message="### update part succeeded" loggingLevel="DEBUG"/>
                </otherwise>
            </choice>
        </loop>

Затем я попытался и другое условие,

<simple>${header.STATUS} == 'SUCCESS' &amp;&amp; ${exchangeProperty[CamelLoopIndex]} &lt; ${headers.PART_COUNT}</simple>

ВерблюдКажется, не принимает логику "и".Приведенная выше оценка всегда возвращает false.Я также попытался заменить '&&' на 'и' или соответствующую HTML-сущность.Нет никакой разницы.Любое предложение о циклическом просмотре списка и корректном завершении работы при отсутствии ошибки?

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

<split> предлагает отличное решение для моего случая использования.В следующем примере кода метод findParts возвращает список объекта Part.Метод обновления устанавливает переменные заголовка, необходимые для вызова веб-службы (createPartService).

<route id="WebServiceUpdateParts">
    <from uri="direct:updateParts"/>
      <split stopOnException="true">
            <method ref="partBean" method="findParts"/>
        <bean ref="partBean" method="update"/>
        <to uri="direct-vm:createPartService"/>
    </split>
    <to uri="mock:endUpdateParts"/>
</route>
0 голосов
/ 12 июня 2018

Вы не установили условие завершения цикла должным образом.


Используйте компонент для управления состоянием завершения цикла

Camel Spring XML

<loop doWhile="true">
    <simple resultType="java.lang.Boolean">${bean:partBean?method=isContinueLoop}</simple>
    ... do stuff here ...
</loop>

Java Bean

public Boolean isContinueLoop(Exchange exchange) throws Exception {
    // System.out.println("LoopIndex: " + exchange.getProperty(Exchange.LOOP_INDEX));

    Boolean result = false;

    String status = exchange.getIn().getHeader("STATUS", String.class);
    Integer loopIndex = exchange.getProperty(Exchange.LOOP_INDEX, -1, Integer.class);
    int maxSize = exchange.getIn().getHeader("PART_COUNT", Integer.class);

    if (status != null && status.equals("SUCCESS") && loopIndex < maxSize) {
        result = Boolean.TRUE;
    }

    return result;
}

Основная проблема в условии ${header.STATUS} == 'SUCCESS' && ${exchangeProperty[CamelLoopIndex]} < ${headers.PART_COUNT} не в операторе AND, а в значениииз ${exchangeProperty[CamelLoopIndex]}.

Если вы раскомментируете системную печать в Java-бине, вы можете заметить, что значение CamelLoopIndex изменяется следующим образом: null -> 0 -> 1 -> 2 -> ..., nullЗначение - это основная проблема, из-за которой ваше условие возвращает false.Чтобы избежать этого в языке Camel Spring XML Simple, вам нужно проверить NULL на CamelLoopIndex с оператором ИЛИ.

В этом смысле вам потребуются как оператор И, так и оператор ИЛИ.Однако это не поддерживается простым языком в настоящее время как состояние в Страница простого языка Раздел 'Использование и / или'.

...