[英]How to call Service Activator dynamically in spring Integration
Currently in our project we are using spring framework. 当前,在我们的项目中,我们正在使用spring框架。 We are planning to implement Spring Integration framework in our project because of some project requirement. 由于某些项目需求,我们计划在我们的项目中实现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 MappingJacksonJsonView 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.ExtendedMappingJacksonJsonView" >
<property name="objectMapper" ref="jaxbJacksonObjectMapper"/>
</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="jaxbJacksonObjectMapper" class="org.springframework.integration.samples.rest.json.JaxbJacksonObjectMapper"/>
As per my understanding flow is like when there is message in input channel employeeSearchService will be activated. 根据我的理解,流程就像输入通道中有消息时, employeeSearchService将被激活。 But as per our project requirement we need activate service at runtime based on some header value like 但是根据我们的项目要求,我们需要在运行时基于一些标头值激活服务,例如
ipaddress
:8080/myapp/LoginService(is ServiceName).action(is method name)than LoginService should be activated and action method should be called. 例如,如果我的网址是http:// ipaddress
:8080 / myapp / LoginService(is ServiceName).action(是方法名称),则应激活LoginService并调用action方法。 Any suggestion and help will be appreciate as SI is new for me. 任何建议和帮助将不胜感激,因为SI对我来说是新的。
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与您的employeeSearchRequest相同)
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.