如何跨多个流重用选择元素?

时间:2011-12-05 10:26:12

标签: spring mule choice

我有一个mule-config文件,我在其中定义了“http inbound”以接受相应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个“流动”就像这个。我想在每个流程中应用这样的“选择”过滤器。

注意在每种情况下都会更改匹配的网址。就像在这种情况下,它是“/ abc / a”。在其他情况下,它是不同的

所以,我想知道,如果有办法避免编写大量的冗余代码并使用参数或其他东西制作一个Spring bean,我可以在每个流上应用.. ??

1 个答案:

答案 0 :(得分:2)

我将路径验证逻辑与实际的请求处理逻辑分开,我将通过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>