使用Spring EL来决定使用哪个出站网关

时间:2013-08-13 08:22:43

标签: spring http expression gateway

我的应用程序可以使用两个Web服务之一,让我们称之为WS A和WS B.两者都包含相同的接口。

我想在HTTP标头和请求通道上执行一些逻辑。 WS B应仅用于某些请求通道。为了决定使用哪个通道,我创建了一个Java类,它将请求通道作为String参数。

<http:outbound-gateway request-channel="XXXXX"
        url-expression="'${EL EXP}'" http-method="GET"
        extract-request-payload="true" expected-response-type="java.lang.String"
        charset="UTF-8" reply-timeout="3000" reply-channel="XXXXX">
    </http:outbound-gateway>

然后我读到在初始化上下文时评估url-expression。

来源:http://forum.springsource.org/showthread.php?113446-Usage-of-expressions-in-http-namespace-element-url

<int-http:outbound-gateway  request-channel="requestChannel"
        url="dummy"
        http-method="GET" extract-request-payload="true" expected-response-type="java.lang.String"
        charset="UTF-8" reply-timeout="3000" reply-channel="sysLoggerRequestChannel"> 
          <int-http:uri-variable name="teststring" expression="test"/>
          <int-http:uri-variable name="url" expression="evalClass.getDestinationForChannel(teststring)"/>
    </int-http:outbound-gateway>

这种方法的问题是int-http:uri-variable中的表达式似乎不是评估。

所有这些让我相信我采取了错误的做法。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

如果您有两个单独的Web服务端点以及确定每个消息使用哪个端点的方法,那么Spring Integration router将更适合于指导您的消息。这样做的另一个好处是,您可以在发送之前对特定于端点的消息进行进一步处理。

配置路由器的方法有很多种,包括编写一个完全自定义的路由器,所以我建议仔细阅读整个部分,看看什么最适合你。

基于消息类型的简单示例:

<int:payload-type-router input-channel="requests">
   <int:mapping type="my.business.WebServiceARequest" channel="wsA" />
   <int:mapping type="my.business.WebServiceBRequest" channel="wsB" />
</int:payload-type-router>

<int-http:outbound-gateway request-channel="wsA" url="http://wsA.com/whatever" 
     ... />
<int-http:outbound-gateway request-channel="wsB" url="http://wsB.com/foo" 
     ... />

答案 1 :(得分:0)

要引用Spring Bean,您应该使用@。因此,expression="evalClass.getDestinationForChannel(teststring)"代替expression="@evalClass.getDestinationForChannel(teststring)",而不是{{1}}。