Mule Esb 3.2.1: сбор результатов делителя и вывод результатов в виде XML - PullRequest
2 голосов
/ 06 марта 2012

Я боролся с SO и форумами Mule, но не могу найти решение, которое работает.ESB принимает один запрос, содержащий идентификатор, который создает полезную нагрузку XML, которая состоит из списка связанных идентификаторов.Эта полезная нагрузка XML затем разделяется и отправляется преобразователю, который получает каждый связанный идентификатор для получения метаданных.Затем предполагается, что результаты будут объединены для получения XML-ответа.У меня проблема в том, что независимо от того, как я преобразую окончательный набор результатов, я всегда возвращаю документ с инкапсулирующей строкой "?? sr) java.util.concurrent.CopyOnWriteArrayListx] ...." "x

Любые идеи / комментарии будут с благодарностью.

Вот мул-конфиг, который я использую:


<http:connector name="HttpConnector" doc:name="HTTP\HTTPS"/>
<expression-transformer name="ExtractId" doc:name="Expression">
    <return-argument evaluator="xpath" expression="//string[1]"/>
</expression-transformer>
<flow name="myFlow1" doc:name="myFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="incoming/path/" connector-ref="HttpConnector" doc:name="HTTP"/>
    <custom-transformer encoding="UTF-8" class="mycomponents.transformers.SubscriberRequestTransformer" doc:name="Create Hub Id Requests"/>
    <mulexml:object-to-xml-transformer doc:name="Object to XML"/>

    <splitter evaluator="xpath" expression="//entry/list/string" enableCorrelation="ALWAYS" doc:name="Splitter"/>
    <transformer ref="ExtractId" doc:name="Transformer Reference"/>
    <logger message="#[payload:]" level="INFO" doc:name="Logger"/>
    <custom-transformer encoding="UTF-8" class="mycomponents.transformers.HubQueryProcessor" doc:name="Create Hub Id Requests"/>
    <collection-aggregator />
    <component  class="mycomponents.TopicResponseAggregatorComponent" doc:name="Collect requests" />
    <logger message="Aggregated Content (#[groovy:payload.size()] elements): \n#[payload:]" level="INFO" doc:name="Logger"/>        
    <logger message="#[payload:]" level="INFO" doc:name="Logger"/>

</flow>

Я решил проблему.Хотя я не совсем понимаю, почему это не так, но я предполагаю, что это связано с некоторой «магией» мулов. Я разделил поток на несколько потоков, что я и собирался сделать в любом случае.При этом проблема исчезла.

К вашему сведению: вот обновленный поток:

<flow name="myFlow1" doc:name="myFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="url/for/service/" connector-ref="HttpConnector" doc:name="HTTP"/>
    <flow-ref name="createHubIdRequestsFlow" doc:name="Map To Hub Ids" doc:description="Takes in the situation id passed in by the client.  Does the query lookup versus the content mapping tables.  creates the correspondng requests for meta data information to the provider(s)"/>
    <flow-ref name="getTopicRequests" doc:name="Process Provider Reponses" doc:description="For each JSON response returned from the provider, transform it into an XML representation of that data"/>
    <flow-ref name="buildResponseFlow" doc:name="Build final response" doc:description="piece all the messages together into a single object as a string"/>

    <response>
        <message-properties-transformer>
            <add-message-property value="text/xml" key="Content-Type" />
        </message-properties-transformer>
    </response>
</flow>

1 Ответ

3 голосов
/ 06 марта 2012

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

Попробуйте это:

    <response>
        <message-properties-transformer scope="outbound">
            <add-message-property value="text/xml" key="Content-Type" />
        </message-properties-transformer>
    </response>
...