Как повторно использовать элемент выбора в нескольких потоках? - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть файл конфигурации mule, где я определил «входящий http», чтобы принять запрос по соответствующему URL.

Теперь мне нужно принять только действующий http-адрес для входа и отклонить другие.

Поэтому я применил фильтр «выбора», чтобы отфильтровать действительные URL-адреса.(вроде следующего):

<flow name="abc">
    <http:inbound-endpoint address="http://localhost:1212/jcore/abc" 
transformer-refs="HttpParams" responseTransformer-refs="JavaObjectToJson" 
contentType="application/json" encoding="UTF-8">

    </http:inbound-endpoint>

    <component class="main.java.com.jcore.abc"/>

    <choice>
        <when evaluator="header" 
expression="INBOUND:http.request.path=/jcore/abc/a">

            <vm:outbound-endpoint path="ToSomething"/>

        </when>

         <when evaluator="header" 
expression="INBOUND:http.request.path=/jcore/abc/b">

            <vm:outbound-endpoint path="ToSomething"/>

        </when>

        <otherwise>
            <message-properties-transformer>
                <add-message-property key="http.status" value="404"/>
            </message-properties-transformer>
            <expression-transformer>
                <return-argument evaluator="string" 
expression="{&quot;Exception&quot;: &quot;Could not Render the Request. 
URL may be wrong&quot;}"/>
            </expression-transformer>
        </otherwise>

    </choice>

</flow>

Это работает .. !!

Но у меня есть около 30 «потоков», как этот.И я хочу применить фильтр «выбор», как это на каждом потоке.

Примечание : соответствующий URL будет изменяться в каждом случае.Как и в этом случае это "/ abc / a".В других это отличается

Итак, я хотел бы знать, есть ли способ избежать написания большей части этого избыточного кода и создать бин Spring с параметрами ИЛИ sumthing else, который я могу применитьна каждом потоке .. ??

1 Ответ

2 голосов
/ 09 декабря 2011

Я бы отделил логику проверки пути от фактической логики обработки запросов, которую я сделаю универсальной, настраиваемой и разделяемой между потоками с помощью конструкции flow-ref.

Примерно так:

<flow name="abc">
    <http:inbound-endpoint address="http://localhost:1212/jcore/abc"
        contentType="application/json" encoding="UTF-8" />

    <message-properties-transformer scope="invocation">
        <add-message-property key="supported.request.paths"
                              value="/jcore/abc/a,/jcore/abc/b"/>
    </message-properties-transformer>    
    <flow-ref name="request-handler" />
</flow>

<flow name="request-handler">
    <script:component>
        <script:script engine="groovy">
            def requestPath = message.getInboundProperty('http.request.path')
            def supportedPaths = message.getInvocationProperty('supported.request.paths')
            def requestPathOk = supportedPaths.split(',').toList().contains(requestPath)
            message.setInvocationProperty('request.path.ok', requestPathOk)
            return message
        </script:script>
    </script:component>
    <choice>
        <when evaluator="header" expression="INVOCATION:request.path.ok=true">
            <vm:outbound-endpoint path="ToSomething" exchange-pattern="request-response" />
        </when>
        <otherwise>
            <message-properties-transformer>
                <add-message-property key="http.status" value="404" />
            </message-properties-transformer>
            <expression-transformer>
                <return-argument evaluator="string"
                    expression="{&quot;Exception&quot;: &quot;Could not Render the Request. URL may be wrong&quot;}" />
            </expression-transformer>
        </otherwise>
    </choice>
</flow>
...