gpt4 book ai didi

java - spring Integration中如何动态调用Service Activator

转载 作者:行者123 更新时间:2023-11-30 04:25:02 28 4
gpt4 key购买 nike

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

我打算抛出 Spring Integration Sample(Spring Integration Rest HTTP Path 使用演示)应用程序

下面是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"/>

根据我的理解,流程就像当输入 channel 中有消息时 employeeSearchService 将被激活。但根据我们的项目要求,我们需要在运行时根据某些 header 值(例如

)激活服务
  • 如果服务名称 = LoginService 并且方法名称 = 操作服务激活器应激活 LoginService 并调用操作方法。基于 url 模式
  • 例如如果我的网址类似于 http://ipaddress:8080/myapp/LoginService(is ServiceName).action(is method name),则应激活 LoginService 并调用操作方法。

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

最佳答案

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

<?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>

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

(input.channel将与您的employeeSearchRequest相同)

另一个选项使用 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>

关于java - spring Integration中如何动态调用Service Activator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140719/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com