2013-10-04 6 views
0

나는 인터넷을 통해 검색 중이며 여러 가지 방법을 시도해 왔지만 제대로 작동하지 못했습니다.아웃 바운드 게이트웨이에서 보낸 사람에게 예외를 throw하는 방법

아웃 바운드 측면에서 throw 된 예외를 catch하는 것이 좋습니다. 예를 들어 일부 유효성 검사는 송신자에게 예외를 반환해야합니다. 이는 성공적으로 전달되지 않았기 때문입니다. DirectChannel을 사용하지 않고 서버에서 요청을 보낼 수 있는지 여부는 알 수 없습니다.

누군가가 나를 도울 수 있기를 바랍니다.

아래 코드에서 SPEL 표현식 인 "checkRemoteOutputHeaders"가있는 필터가 실행될 때 예외를 던지는 SI 구성을 보여줍니다. 다른 변압기 "customJsonToObjectTransformer는"단지 문자열 페이로드를 변환

@Transformer 
public Message<ServiceException> transform(ErrorMessage message){ 

    LOGGER.debug("INIT - transform(message=" + message + ")"); 

    MessagingException messageException = (MessagingException) message.getPayload(); 

    ServiceException serviceEx = new ServiceException(messageException.getMessage(), messageException.getCause()); 

    Message<?> originalMsg = messageException.getFailedMessage(); 

    Message<ServiceException> transformedObj = MessageBuilder.withPayload(serviceEx).copyHeaders(originalMsg.getHeaders()).build(); 


    LOGGER.debug("END - transform=" + transformedObj); 

    return transformedObj; 
} 

: 다음 코드에서

<int:channel id="requestChannelSb"> 
    <int:interceptors> 
     <int:wire-tap channel="timeStampCalllogger" /> 
    </int:interceptors> 
</int:channel> 

<task:executor id="threadPoolTaskExecutor" pool-size="10" queue-capacity="100" rejection-policy="DISCARD_OLDEST" /> 

<bean id="taskExecutor" class="org.springframework.integration.util.ErrorHandlingTaskExecutor"> 
    <constructor-arg name="executor" ref="threadPoolTaskExecutor"/> 
    <constructor-arg name="errorHandler"> 
     <bean class="org.springframework.integration.channel.MessagePublishingErrorHandler"> 
      <property name="defaultErrorChannel" ref="errorChannel"/> 
     </bean> 
    </constructor-arg> 
</bean> 

<int:channel id="gatewayChannelSb"> 
    <int:dispatcher task-executor="taskExecutor" failover="false"/> 

    <int:interceptors> 
     <int:wire-tap channel="timeStampInitlogger" /> 
    </int:interceptors> 
</int:channel> 
<int:channel id="responseChannelSb"> 
    <int:interceptors> 
     <int:wire-tap channel="timeStampEndlogger" /> 
    </int:interceptors> 
</int:channel> 
<int:channel id="errorChannel"> 
    <int:interceptors> 
     <int:wire-tap channel="errorlogger"/> 
    </int:interceptors> 
</int:channel> 


<int-http:outbound-gateway request-channel="requestChannelSb" 
    url="{urlVar}" http-method="POST" 
    extract-request-payload="true" 
    expected-response-type="java.lang.String" 
    charset="UTF-8" 
    header-mapper="headerMapper" 
    reply-channel="responseChannelSb" 
    request-timeout="60000"> 

    <int-http:uri-variable name="urlVar" expression="T(gnf.servicebroker.util.Utils).getUrl(headers)" /> 

</int-http:outbound-gateway> 

<int:chain input-channel="responseChannelSb"> 
    <int:header-enricher> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).BEAN}" expression="headers[T(gnf.servicebroker.util.Constantes$HEADERS).BEAN]"/> 
    </int:header-enricher> 
    <int:transformer ref="customJsonToObjectTransformer"/> 
</int:chain> 


<int:chain id="chain" input-channel="gatewayChannelSb" output-channel="requestChannelSb"> 

    <int:header-enricher> 
     <int:error-channel ref="errorChannel" overwrite="true"/> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).REQUEST_ID}" expression="headers[T(gnf.servicebroker.util.Constantes$HEADERS).ID].toString()"/> 
    </int:header-enricher> 

    <int:filter expression="T(gnf.servicebroker.util.Utils).checkRemoteOutputHeaders(headers)" discard-channel="errorChannel" /> 

    <int:header-enricher> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).CONTENT_TYPE}" value="text/x-json" /> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).ACCEPT}" value="text/x-json" /> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).BEAN}" expression="T(gnf.servicebroker.util.Utils).getPayloadCanonicalClassName(payload)" /> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).SECURITY_USER}" expression="T(gnf.servicebroker.util.Utils).getSecurityUser()"/> 
     <int:header name="#{T(gnf.servicebroker.util.Constantes$HEADERS).TARGET}" expression="T(gnf.servicebroker.util.Utils).getTargetUrl()"/> 
    </int:header-enricher> 

    <int:object-to-json-transformer object-mapper="jsonObjectMapper"/> 
</int:chain> 



<!-- Logging channels --> 

<int:logging-channel-adapter id="timeStampInitlogger" level="INFO" expression="'Inicio de la peticion: '.concat(T(gnf.servicebroker.util.Utils).getRequestInfoTrace(headers))"/> 
<int:logging-channel-adapter id="timeStampCalllogger" level="INFO" expression="'Envio de la peticion: '.concat(T(gnf.servicebroker.util.Utils).getRequestInfoTrace(headers))"/> 
<int:logging-channel-adapter id="timeStampEndlogger" level="INFO" expression="'Final de la peticion: '.concat(T(gnf.servicebroker.util.Utils).getRequestInfoTrace(headers))"/> 
<int:logging-channel-adapter id="destinationCalllogger" level="INFO" expression="'Destino peticion: '.concat(headers[T(gnf.servicebroker.util.Constantes$HEADERS).SUBSYSTEM])"/> 

<int:logging-channel-adapter id="errorlogger" level="ERROR" expression="'ERROR: '.concat(T(gnf.servicebroker.util.Utils).getRequestInfoTrace(headers))"/> 

<!-- End Logging channels --> 


<int:chain input-channel="errorChannel" output-channel="responseChannelSb"> 
    <int:transformer ref="messageHandlingExceptionTransformer"/> 
</int:chain> 

난 당신에게 ServiceException에 MessaggingException 변환 변압기, "messageHandlingExceptionTransformer"(사용자 정의 예외)를 보여 (JSON)을 Java 객체에 추가하여 반환하지만 페이로드가 String이 아닌 경우 (예 : 예외) 직접 반환합니다.

사전.

답변

0

마지막으로 호출자가 아웃 바운드 수명주기 동안 throw 된 Exception을받지 못하는 이유를 발견했습니다.

다른 XML 파일에서 아웃 바운드 구성에 정의 된 것과 동일한 오류 채널을 나타내는 게이트웨이 정의가 있었기 때문에 나는 단지 구성 문제였습니다. 그래서 아웃 바운드에서 Exception을 가진 ErrorMessage는 errorChannel에서 한 번 관리 된 다음 게이트웨이의 오류 채널에서 다시 관리되기 때문에 주기적으로 호출 체인이 만들어 지므로 청원서가 체인에 다시 들어가기 때문에 errorChannel을 관리하고 마지막으로 호출자에게 알리지 않고 실패합니다.

<int:gateway id="gcccSearchServiceRequestByCodeServiceSb" 
    service-interface="gnf.servicebroker.gps.atencioncliente.atcomercializadora.servicerequest.service.GcccSearchServiceRequestByCodeServiceISb" 
    default-request-channel="gatewayChannelSb" 
    error-channel="errorChannel"> 
    <int:method name="gcccSearchServiceRequestByIdSr"> 
     <int:header name="Method" value="gcccSearchServiceRequestByIdSr"/> 
     <int:header name="Module" value="atencioncliente"/> 
     <int:header name="Service" value="gnf.servicebroker.gps.atencioncliente.atcomercializadora.servicerequest.service.GcccSearchServiceRequestByCodeServiceISb"/> 
     <int:header name="SubSystem" value="atec-web"/> 
    </int:method> 
</int:gateway> 

공지 사항 때문에 예외를 잡을 수있는이 속성을 호출을 제거, 아웃 바운드 구성의 오류 채널 definend보다 같은 값을 갖는 오류 채널 속성 :

<int:gateway id="gcccSearchServiceRequestByCodeServiceSb" 
    service-interface="gnf.servicebroker.gps.atencioncliente.atcomercializadora.servicerequest.service.GcccSearchServiceRequestByCodeServiceISb" 
    default-request-channel="gatewayChannelSb"> 
    <int:method name="gcccSearchServiceRequestByIdSr"> 
     <int:header name="Method" value="gcccSearchServiceRequestByIdSr"/> 
     <int:header name="Module" value="atencioncliente"/> 
     <int:header name="Service" value="gnf.servicebroker.gps.atencioncliente.atcomercializadora.servicerequest.service.GcccSearchServiceRequestByCodeServiceISb"/> 
     <int:header name="SubSystem" value="atec-web"/> 
    </int:method> 
</int:gateway> 

I을 누구에게나 도움이되기를 바랍니다.

감사합니다.

관련 문제