2
votes

Here is what I'm trying to achieve. Poll an HTTP API once every 15 minutes and process the data retrieved from this. We plan to use Spring Integration. I'm new to this. So with little understanding, I've created an outbound gateway and added poller for the same, but getting the below error.

Also, can someone tell me how can I use transformer to process the data from the outbound gateway?

Error creating bean with name 'org.springframework.integration.config.ConsumerEndpointFactoryBean#0':
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
A poller should not be specified for endpoint 'org.springframework.integration.config.ConsumerEndpointFactoryBean#0', 
since 'in' is a SubscribableChannel (not pollable).

My int-config.xml file is

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

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

    <int:channel id="userSearchRequest" />
    <int:channel id="userSearchResponse" />


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

    <int-http:inbound-gateway id="inboundUserSearchRequestGateway"
        supported-methods="GET, POST"
        request-channel="userSearchRequest"
        reply-channel="userSearchResponse"      
        mapped-response-headers="Return-Status, Return-Status-Msg, HTTP_RESPONSE_HEADERS"
        view-name="/users"
        path="/users/{id}/search"
        reply-timeout="50000">

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

    </int-http:inbound-gateway>

    <!-- Consume WS Sample -->
    <int:channel id="in" />
    <int:channel id="out" />

     <int-http:outbound-gateway request-channel="in" reply-channel="out"
        url="http://echo.jsontest.com/key/value/one/two" http-method="GET" 
        expected-response-type="java.lang.String">
        <int:poller fixed-rate="20000"/>
    </int-http:outbound-gateway>

    <int:transformer input-channel="in"
    output-channel="out" ref="hTTPTransformer" />

    <!-- Consume WS Sample Ends -->


    <!-- 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="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
                <property name="defaultContentType" value="application/json"/>
                <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>
            </bean>
        </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" context-path="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"/>

    <int:service-activator id="userServiceActivator"
                    input-channel="userSearchRequest"
                    output-channel="userSearchResponse"
                    ref="userSearchService"
                    method="getUsers"
                    requires-reply="true"
                    send-timeout="60000"/>                  

    <bean id="jaxbJacksonObjectMapper" class="org.springframework.integration.samples.rest.json.JaxbJacksonObjectMapper"/>

</beans>

Can someone tell me why am I getting this error? Thanks in advance guys!

1
A Gateway is not for polling - it is meant to be triggered by a message on the request-Channel. My guess is you need an http-inbound-adapter instead. Or maybe an http-outbound-adapter - not sure.Jens Krogsboell
@JensKrogsboell Thanks for pointing that out. Adding inbound-channel-adapter made it poll! If possible, can you tell how can I get JSON object from this API and process it using transformer?Rajkumar

1 Answers

1
votes

1st UPDATE : For Polling, adding inbound-channel-adapter worked

<int-http:outbound-gateway request-channel="in" reply-channel="out"
        url="http://echo.jsontest.com/key/value/one/two" http-method="GET" 
        expected-response-type="java.lang.String">
    </int-http:outbound-gateway>

<int:inbound-channel-adapter channel="in" expression="''">
        <int:poller fixed-delay="60000"></int:poller>
    </int:inbound-channel-adapter>

2nd UPDATE : For transforming response to bean, added this code

<int:json-to-object-transformer input-channel="out" 
output-channel="testChannel" type="org.springframework.integration.samples.rest.domain.PlaceholderBean"/>

<int:service-activator method="dummyMethod" input-channel="testChannel" ref="dummyService"/> 

Finally, I'm able to poll HTTP Service, get data and process it! Thanks @JensKrogsboell for all the help!