Как я могу остановить цикл foreach между ними в mulesoft

У меня есть значения списка массивов, которые я зацикливаю, используя foreach и selection. Как только произойдет первый успех в выборе, я хочу выйти из цикла foreach. И я не хочу продолжать проверять остальные условия. В потоке мьюлсофт

Заранее спасибо.


person Ashok Shiva Palaki    schedule 02.01.2017    source источник


Ответы (6)



Пожалуйста, используйте оператор Break для выхода из цикла foreach в соответствии с вашим условием true.

person Raju Mali    schedule 02.01.2017
comment
Спасибо за ваш ответ, мистер Раджу Мали. В java все работает нормально, но мне нужно решение в Mulesoft. - person Ashok Shiva Palaki; 02.01.2017

Как вы упомянули в своем примере использования, оберните message filter внутри вашего for-loop.

<foreach doc:name="For Each" collection="#[]">
    <message-filter onUnaccepted="flow" >
        <expression-filter expression="#[]"/>
    </message-filter>
</foreach>
person vijay dhanakodi    schedule 03.01.2017
comment
Спасибо, Виджей, за ваш ответ, только что я попробовал ваше предложение следующим образом ------- ‹message-filter onUnaccepted=sampleflowFlow doc:name=Message› ‹expression-filter expression=#[flowVars.a1=='true' ]/› ‹/message-filter›------ но в этом сценарии он перенаправляет начальную точку потока и выдает исключение, потому что мой ввод - это xml после этой операции я получил json message-filter пытается дать json в качестве входных данных для моего потока. Я хочу прервать цикл только для того, чтобы не перенаправлять весь поток. Спасибо - person Ashok Shiva Palaki; 03.01.2017

Прежде всего, вы должны выяснить, по какому индексу вы получите сообщение об успехе, используя метод indexOf. Затем после использования метода subList получить требуемый список и использовать этот список в цикле Foreach.

 <foreach collection="#[payload.subList(0,3)]" doc:name="For Each">
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </foreach>
person RakeshSharma227    schedule 04.01.2017
comment
Это не работает, так как OP хочет найти соответствующую строку внутри для каждого цикла. - person Möoz; 12.01.2017

Используйте Groovy

Вы можете управлять потоком скрипта Groovy намного проще, чем традиционный преобразователь «для каждого». В вашем конкретном случае ваш отличный скрипт будет выглядеть примерно так (но не совсем так):

<scripting:component doc:name="Groovy">
 <scripting:script engine="Groovy"><![CDATA[// Define the collection to loop
    def loopCollection = flowVars.nameOfCollectiontoLoop

    // Define the condition which needs to be met
    def exitCondition = "Some condition to match"

    // Loop the collection to do what you need
    loopCollection.each { row ->
        if (row.identifierName == exitCondition)
        {
            return
        }
        else
        {
            // Continue your processing
        }   
    }

    return payload]]></scripting:script>
</scripting:component>

Используйте выбор стратегия остановки обработки

Другой способ, который я могу придумать, это использовать Выберите, как только вы войдете в цикл, чтобы увидеть, выполнялось ли условие ранее, если да, ничего не делайте; следующее:

<flow name="testsFlow">
        <set-variable variableName="conditionMet" value="#[false]" doc:name="conditionMet"/>
        <foreach doc:name="For Each">
            <choice doc:name="Choice">
                <when expression="#[(flowVars.conditionMet == true)]">
                    <scripting:component doc:name="Do nothing">
                        <scripting:script engine="Groovy"/>
                    </scripting:component>
                </when>
                <otherwise>
                    <scripting:component doc:name="Continue Loop">
                        <scripting:script engine="Groovy"><![CDATA[// Define the collection to loop
def loopCollection = flowVars.nameOfCollectiontoLoop

// Define the condition which needs to be met
def exitCondition = "Some condition to match"

// Define the "conditionMet" variable
def conditionMet = flowVars.conditionMet

// Loop the collection to do what you need
loopCollection.each { row ->
    if (row.identifierName == exitCondition)
    {
        conditionMet = true
    }
    else
    {
        conditionMet = false
        // Continue your processing
    }   
}

return payload]]></scripting:script>
                    </scripting:component>
                </otherwise>
            </choice>
        </foreach>
    </flow>

Попробуйте их и дайте нам знать, если вам нужна дополнительная помощь.

person Möoz    schedule 12.01.2017

Нет компонента для прерывания цикла foreach. Если вы хотите обрабатывать только до условия успеха, вы можете использовать MEL для выполнения foreach в подсписке следующим образом:

<foreach collection="#[payload<condition>]" />
 ...
</foreach>

Вы также можете использовать циклы в Groovy.

Пример. В полезной нагрузке у меня есть HashMap -

def nap = payload.Result
 for (v in nap)
 {
     if (v.Name == '!!! а папка')
     {
         assert v.Id != null
         flowVars['folderid'] = v.Id
         payload = 'recived Id of folder object is '+v.Id
         break
     }

 }
 return payload
person Sanjeet Pandey    schedule 06.12.2017