2017-11-15 2 views
1

Mit der Federintegration lese ich aus einer Warteschlange und rufe dann einen REST-Dienst mit http: outbound-gateway auf. Der Code funktioniert gut. Aber ich möchte die Protokolle so beziehen, dass für ein bestimmtes Anfrage-Schlüsselfeld so und so eine Antwort empfangen wird. Andernfalls ist es sehr schwierig zu bestimmen, für welche Anfrage die Antwort empfangen wird, wenn Tausende von Nachrichten durch die Warteschlange fließen.So protokollieren Sie Anforderungsdaten zusammen mit Antwortdaten in http: outbound-gateway

Meine JSON Anforderung für den Dienst Ruf ist wie folgt: { "ID": "123", "Status": "A"}

vom Serviceaufruf meiner JSON Antwort lautet wie folgt: { "transactionStatus": "Erfolg"}

Ich möchte protokollieren, so dass "ID: 123" hat eine Antwort transactionStatus als "Erfolg". Bitte helfen Sie mir mit dem Code, wie ich das erreichen kann. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Vielen Dank im Voraus.

<int:object-to-json-transformer input-channel = "gcmRequestChannel" output-channel="RESTSrvcChannel"></int:object-to-json-transformer> 

<int:header-enricher id = "restenricher" input-channel = "RESTSrvcChannel" output-channel = "RESTSrvcChannel2"> 
    <int:header name="contentType" value="application/json"/> 
    <int:header name="SPApikey" value="${throttler.SPApikey}" /> 
</int:header-enricher> 
<http:outbound-gateway id="gcmrestHttpOutboundGateway" request-channel="RESTSrvcChannel2" reply-channel="nullChannel" 
         extract-request-payload="true" 
         url="${throttler.url}" 
         header-mapper="headerMapper" 
         http-method="POST" 
         expected-response-type="java.lang.String" 
         > 

</http:outbound-gateway> 
<beans:bean id="headerMapper" 
    class="org.springframework.integration.http.support.DefaultHttpHeaderMapper"> 
    <beans:property name="inboundHeaderNames" value="*" /> 
    <beans:property name="outboundHeaderNames" value="HTTP_REQUEST_HEADERS,SPApikey" /> 
    <beans:property name="userDefinedHeaderPrefix" value="" /> 
</beans:bean> 

Antwort

0

Seit dem Frühjahr Integration beschäftigt sich mit dem Message Objekt in seine Komponenten und über Kanäle dazwischen, ist es eine schöne Lösung wie Versorgung Ihre wichtigen Informationen in den Headern und sie werden in der replyMessage verfügbar sein für Ihre Protokollierung Zweck:

<header-enricher> 
    <header name="originalPayload" expression="payload"/> 
</header-enricher> 
1

Ich habe wie von Ihnen vorgeschlagen codiert. Vielen Dank für Ihre Antwort.

<int:header-enricher id = "gcmrestenricher" input-channel = "gcmRESTSrvcChannel" output-channel = "gcmRESTSrvcChannel2"> 
    <int:header name="contentType" value="application/json"/> 
    <int:header name="SPApikey" value="${throttler.SPApikey}" /> 
    <int:header name="JSONPayload" expression="payload"/> 
</int:header-enricher> 

<http:outbound-gateway id="gcmrestHttpOutboundGateway" request-channel="gcmRESTSrvcChannel2" reply-channel="gcmRESTSrvcOutputChannel" 
         extract-request-payload="true" 
         url="${throttler.gcmurl}" 
         header-mapper="gcmheaderMapper" 
         http-method="POST" 
         expected-response-type="java.lang.String" 
         > 

</http:outbound-gateway> 
<beans:bean id="gcmheaderMapper" 
    class="org.springframework.integration.http.support.DefaultHttpHeaderMapper"> 
    <beans:property name="inboundHeaderNames" value="*" /> 
    <beans:property name="outboundHeaderNames" value="HTTP_REQUEST_HEADERS,SPApikey,JSONPayload" /> 
    <beans:property name="userDefinedHeaderPrefix" value="" /> 
</beans:bean> 
<beans:bean id="logmsg" class = "com.MLAServiceActivator"></beans:bean> 
<int:service-activator requires-reply="false" input-channel="gcmRESTSrvcOutputChannel" ref="logmsg" method="ResponseLogging"></int:service-activator> 


@ServiceActivator 
public void ResponseLogging(Message<String> message) 
{ 
    logger.info("The response message is:"+message.getPayload()+ " for request message:"+message.getHeaders().get("JSONPayload")); 
} 
Verwandte Themen