2014-09-04 5 views
1

Ниже кода с использованием Spring интеграции 2.2.6Spring Integration Http Inbound шлюз Отправка пустой JSON ответ

Я хочу, чтобы отправить ответ обратно к входящему шлюзу через канал ответов. Я посылаю ответ от активатора службы. Но весна не в состоянии установить ответ вместо возвращения пустого сообщения

Spring-интеграция XML Config

<int-http:inbound-gateway id="entryHttpInboundGateway" 
     request-channel="entryInputChannel" path="/service/getSE/{uuid}" reply-channel="entryInboundReplyChannel" 
     request-payload-type="com.test.ServiceEvent" mapped-response-headers="eventUUID, HTTP_RESPONSE_HEADERS" 
     supported-methods="GET, POST" reply-timeout="1000" view-name="/process/plain2"> 
     <int-http:header name="eventUUID" expression="#pathVariables.uuid"/> 
</int-http:inbound-gateway> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1" 
     p:defaultContentType="application/json"> 
     <property name="defaultViews"> 
      <list> 
       <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
      </list> 
     </property> 
</bean> 

<int:service-activator id="sv2" input-channel="entryInputChannel" output-channel="outputChannel" 
    method="sendReply" requires-reply="true" ref="checkService"> 
    </int:service-activator> 

<bean id="checkService" class="com.test.CheckService" /> 

Проводок сообщения для въездного адаптера ответа канала(com.test.CheckService.java)

// Preparing the message to be sent to reply channel 
    InboundReplyResponse inboundReplyResponse = new InboundReplyResponse(); 
     inboundReplyResponse.setMessage("Success"); 
     inboundReplyResponse.setEventUUID("12345"); 

    Map<String, Object> responseHeaderMap = new HashMap<String, Object>(); 
        responseHeaderMap.put("eventUUID",eventUUID); 
        responseHeaderMap.put("Content-Type","application/json"); 

    GenericMessage<InboundReplyResponse> message = new GenericMessage<InboundReplyResponse>(inboundReplyResponse,responseHeaderMap); 


    //Reply queue -> entryInboundReplyChannel 
     MessageChannel entryInboundReplyChannel = (MessageChannel) AppFactory.getApplicationContext().getBean("entryInboundReplyChannel"); 

    entryInboundReplyChannel.send(message); 

web.xml

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring-integration-context.xml</param-value> 
    </context-param> 


    <servlet> 
     <servlet-name>ssTesting</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping>  
     <servlet-name>ssTesting</servlet-name>  
     <url-pattern>/service/*</url-pattern> 
    </servlet-mapping> 

Response вернулся к клиенту

<Empty JSON content> 

ответ

0

Ваш код выглядит плохо.

Вы можете отправить напрямую entryInboundReplyChannel, только если вы находитесь в потоке вызовов шлюза. Поскольку номер шлюза sendAndReceive полагается на TemporaryReplyChannel в MessageHeaders. И последний используется независимо от явного reply-channel на inbound-gateway.

Почему просто не использовать entryInboundReplyChannel как output-channel для <service-activator> и просто возвращает сообщение от sendReply метода и полагаться только на Framewrok способности midiate правильно поступать?

I meand не использовать entryInboundReplyChannel.send(message) вручную.

+0

спасибо Артему за ответ. Я хочу сразу ответить клиенту через канал ответа с помощью «uuid», когда я получаю запрос. Я не хочу ждать завершения всей моей обработки и отправки ответа. Поэтому отправьте ответ обратно с помощью entryInboundReplyChannel.send (сообщение). Как указано, чтобы использовать исходящий канал в качестве канала ответа, исходящий канал настраивается как вход для маршрутизатора для дальнейшей обработки. Поэтому мне пришлось написать код отправки вручную в активаторе службы, который имеет входной канал канала запроса. – Jatin

0

решаемые

// Instead of creating a new header, Request Message header should be used 

public Message<ServiceMsg> (Message<?> inMessage){ 
.... 
.... 
GenericMessage<InboundReplyResponse> message = new GenericMessage<InboundReplyResponse>(inboundReplyResponse,inMessage.getHeaders()); 
Смежные вопросы