简体   繁体   English

如何在Spring Integration中动态调用Service Activator

[英]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 但是根据我们的项目要求,我们需要在运行时基于一些标头值激活服务,例如

  • if service name = LoginService and method name = action than Service Activator should activate LoginService and call action method. 如果服务名称= LoginService并且方法名称= action,则服务激活器应激活LoginService并调用操作方法。 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. 例如,如果我的网址是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.

相关问题 Spring集成服务激活器不发送空回复 - Spring integration service activator not sending null reply Spring 集成 - SQS 消息的异步服务激活器 - Spring Integration - Async service activator for SQS messages 没有输出通道的Spring Integration Service Activator - Spring Integration Service Activator Without Output Channel 了解弹簧集成服务激活器 - Understanding spring-integration service-activator Spring集成中的服务激活器组件是什么? - What is service activator component in spring integration? Spring 集成:如何通过服务激活器作为并行服务使多线程从可轮询通道轮询消息 - Spring integration: how to make multi thread to poll message from a pollable channel through service activator as a paraller service Spring Integration + Spring AMQP:如何将MessageProperties传递给int:service-activator? - Spring Integration + Spring AMQP: How can I passing MessageProperties to int:service-activator? Spring Integration Java DSL单元测试-如何模拟Service Activator类或其他组件/端点? - Spring Integration Java DSL unit test - How to mock a Service Activator class or other components/endpoints? Spring Integration Java Config / DSL中没有方法的服务激活器 - Service Activator without method in Spring Integration Java Config / DSL spring integration:service activator requires-reply =“false”用法 - spring integration: service activator requires-reply=“false” usage
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM