Итерация массива с использованием области foreach Mule

Я хотел бы перебрать массив и использовать значение, взятое из массива, чтобы поместить его в конечную точку входящего трафика http. Как я могу выполнить итерацию по этому массиву и взять значение из массива, чтобы поместить его в качестве переменной в входящую конечную точку http?

Код, который я пробовал, был:

<flow name="foreachFlow1" doc:name="foreachFlow1">
    <poll frequency="2000">
    <foreach collection="#[groovy:['localhost:8082', 'localhost:8083']]"
        doc:name="For Each">
        <http:outbound-endpoint exchange-pattern="request-response"
            address="http://#[payload]" method="GET" doc:name="HTTP" />
    </foreach>
    </poll>
</flow>

и я получаю ошибку

Invalid content was found starting with element 'poll'

person Emm    schedule 30.09.2013    source источник
comment
Чего вы пытаетесь достичь: слушать кучу разных портов/путей? Я рассмотрю свой ответ на основе ваших разъяснений.   -  person David Dossot    schedule 01.10.2013
comment
Я пытаюсь опросить несколько адресов, используя ‹http:inbound-endpoint exchange-pattern=request-response address=google.com Connector-ref=PollingHttpConnector doc:name=HTTP/› с полем адреса, содержащим переменную, для опроса по разным адресам. Поэтому я думал об использовании массива для перебора списка адресов для опроса. Это возможно?   -  person Emm    schedule 01.10.2013
comment
Привет, Эмм, по сути, каждый элемент в итерации привязывается к полезной нагрузке, поэтому вы должны использовать #[payload] для доступа к ней. В предыдущем вопросе есть пример: stackoverflow.com/questions/18970495/   -  person justin    schedule 01.10.2013


Ответы (1)


Входящие конечные точки являются источниками сообщений и не могут быть параметризованы так, как вы описываете.

Чтобы достичь своей цели, попробуйте <poll> источник сообщений обернуть foreach, который использует http:outbound-endpoint для выполнения взаимодействий GET (@method) request-response (@exchange-apttern).

Хитрость заключается в том, чтобы вернуть результаты HTTP-вызовов через foreach, которые по умолчанию этого не делают. Следующие примеры иллюстрируют возможный подход:

<flow name="foreachFlow1">
    <poll frequency="2000">
        <processor-chain>
            <set-variable variableName="httpResponses" value="#[[]]" />
            <foreach collection="#[groovy:['localhost:8082', 'localhost:8083']]">
                <http:outbound-endpoint
                    exchange-pattern="request-response" address="http://#[payload]"
                    method="GET" />
                <expression-component>httpResponses.add(message.payloadAs(java.lang.String))
                </expression-component>
            </foreach>
        </processor-chain>
    </poll>
    <logger level="INFO" message="#[httpResponses]" />
</flow>

<!-- Test server stubs -->

<flow name="server8082">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:8082" />
    <set-payload value="This is 8082" />
</flow>

<flow name="server8083">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:8083" />
    <set-payload value="This is 8083" />
</flow>
person David Dossot    schedule 30.09.2013
comment
@davis Я попытался использовать пример из моего предыдущего вопроса и использовал источник сообщения «опрос» для переноса foreach, но я получаю сообщение об ошибке «Найден недопустимый контент, начиная с элемента «опрос». Я отредактировал свой исходный вопрос и поместил туда код - person Emm; 02.10.2013
comment
Удалите <http:inbound-endpoint>: у вас может быть только один источник сообщений для каждого потока, а poll — это источник сообщений. - person David Dossot; 02.10.2013
comment
Я забыл показать закомментированный ‹http:inbound-endpoint›, но даже после его удаления я все еще получаю сообщение об ошибке. - person Emm; 02.10.2013
comment
Да, и ваша конфигурация идеально подходит для Mule 3.4.0 CE. Я предполагаю, что Studio, а не Mule сообщает о Invalid content was found starting with element 'poll'? Если это так, просто игнорируйте это, Studio не полностью понимает Mule XSD. Фактическая проблема, с которой вы столкнулись, заключается в том, что foreach не передает результат процессоров сообщений, которые он содержит, обратно вызывающей стороне. Я пытаюсь найти обходной путь. - person David Dossot; 02.10.2013
comment
Если я использую точный код из примера из моего предыдущего вопроса, но просто закомментирую <http:inbound-endpoint> и добавлю poll, я получу ошибку The content of element 'flow' is not complete.. Я не понимаю, почему это не будет полным.. - person Emm; 02.10.2013
comment
См. мой пересмотренный ответ с полными рабочими образцами. - person David Dossot; 02.10.2013
comment
Благодарю вас! Знаете ли вы, можно ли заменить localhosts URL-ссылками типа http://www.google.com/? - person Emm; 02.10.2013