java spring集成中如何动态调用Service Activator

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16140719/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 22:02:16  来源:igfitidea点击:

How to call Service Activator dynamically in spring Integration

javaspringspring-integration

提问by Harshil

Currently in our project we are using spring framework. We are planning to implement Spring Integration framework in our project because of some project requirement.

目前在我们的项目中,我们使用的是 spring 框架。由于一些项目需求,我们计划在我们的项目中实施 Spring Integration 框架。

I was going throw Spring Integration Sample(Spring Integration Rest HTTP Path Usage Demo) appications

我要抛出 Spring Integration Sample(Spring Integration Rest HTTP Path Usage Demo) 应用程序

below is applicationContext-http-int.xml file

下面是 applicationContext-http-int.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd      
    http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd   
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:oxm="http://www.springframework.org/schema/oxm" 
xmlns:int-http="http://www.springframework.org/schema/integration/http">

<int:annotation-config/>

<!-- handler mapping implementation that is aware of inbound Spring Integration 
        http inbound gateway's and inbound adapter's with "path" attributes -->
<bean class="org.springframework.integration.http.inbound.UriPathHandlerMapping"/>

<!-- Inbound/Outbound Channels -->
<int:channel id="employeeSearchRequest" />
<int:channel id="employeeSearchResponse" />


<int-http:inbound-gateway id="inboundEmployeeSearchRequestGateway"      
    supported-methods="GET, POST" 
    request-channel="employeeSearchRequest"
    reply-channel="employeeSearchResponse"      
    mapped-response-headers="Return-Status, Return-Status-Msg, HTTP_RESPONSE_HEADERS"       
    view-name="/employee" 
    path="/services/employee/{id}/search"
    reply-timeout="50000">

    <int-http:header name="employeeId" expression="#pathVariables.id"/>

</int-http:inbound-gateway>


<!-- Note: The default parameter name for favorParameter is 'format'. For instance, when this flag is true, a request for /services/employee/{id}/search?format=json will result 
        in an MappingHymansonJsonView being resolved, while the Accept header can be the browser-defined text/html,application/xhtml+xml  -->

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" /> 
    <property name="defaultContentType" value="application/xml"/>
    <property name="favorParameter" value="true"/>  
    <property name="ignoreAcceptHeader" value="true" />     
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />             
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean
                class="org.springframework.integration.samples.rest.json.view.ExtendedMappingHymansonJsonView" >
                <property name="objectMapper" ref="jaxbHymansonObjectMapper"/>
            </bean> 
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg ref="marshaller"/>                 
            </bean>             
        </list>
    </property>             
</bean>

<oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.integration.samples.rest.domain" />

<int:service-activator id="employeeServiceActivator" 
                input-channel="employeeSearchRequest"
                output-channel="employeeSearchResponse" 
                ref="employeeSearchService" 
                method="getEmployee" 
                requires-reply="true"  
                send-timeout="60000"/>

<bean id="jaxbHymansonObjectMapper" class="org.springframework.integration.samples.rest.json.JaxbHymansonObjectMapper"/>              

As per my understanding flow is like when there is message in input channel employeeSearchServicewill be activated. But as per our project requirement we need activate service at runtime based on some header value like

根据我的理解,流程就像当输入通道有消息时,employeeSearchService将被激活。但是根据我们的项目要求,我们需要在运行时根据一些标头值激活服务,例如

  • if service name = LoginService and method name = action than Service Activator should activate LoginService and call action method. based on url pattern
  • For example if my url is like http://ipaddress:8080/myapp/LoginService(is ServiceName).action(is method name)than LoginService should be activated and action method should be called.
  • 如果服务名称 = LoginService 和方法名称 = 操作,则服务激活器应该激活 LoginService 并调用操作方法。基于 url 模式
  • 例如,如果我的 url 类似于 http:// ipaddress:8080/myapp/LoginService(is ServiceName).action(is method name),那么应该激活 LoginService 并调用 action 方法。

Any suggestion and help will be appreciate as SI is new for me.

任何建议和帮助将不胜感激,因为 SI 对我来说是新的。

回答by incomplete-co.de

there are a couple of ways to answer this one. the first is to use a simple header value

有几种方法可以回答这个问题。第一种是使用简单的标头值

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.2.xsd">

    <!-- input channel where the message starts -->
    <int:channel id="input.channel"/>

    <!-- routes to the different services based on the header value -->
    <int:header-value-router input-channel="input.channel" header-name="serviceName">
        <int:mapping value="a" channel="service.a.channel"/>
        <int:mapping value="b" channel="service.b.channel"/>
    </int:header-value-router>

    <!-- when serviceName header == 'a' -->
    <int:channel id="service.a.channel"/>

    <int:service-activator input-channel="service.a.channel" ref="serviceA"/>

    <!-- when serviceName == 'b' -->
    <int:channel id="service.b.channel"/>

    <int:service-activator input-channel="service.b.channel" ref="serviceB"/>
</beans>

this example allows you to expand according to the different services you may require and multiple options.

此示例允许您根据您可能需要的不同服务和多个选项进行扩展。

(input.channel would be the same as your employeeSearchRequest)

(input.channel 将与您的员工搜索请求相同)

the other option uses SpEL and assumes there's only two services

另一个选项使用 SpEL 并假设只有两个服务

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.2.xsd">

    <int:channel id="input.channel"/>

    <int:service-activator input-channel="input.channel"
        expression="headers['serviceName'] == 'a' ? @serviceA.process(payload) : @serviceB.process(payload)"/>

</beans>