2015-11-20 50 views
1

我有一個rabbitmq作爲傳輸的spring xd模塊。我的模塊有調用REST URL http://x.y.z/testhttp客戶端彈出xd問題

stream create --name cycletest4 --definition "http | http-client --url='''https://x.y.z/test''' --httpMethod=GET | log" 

http post --data '{ "messageAttribute": { "channelType" : "EML", "contentKey" : "20020", "messageFormat" : "1", "contentSubscriber" : "dmttts", "languageCode" : "en-ca" }, "substitutionKeyValueData" : { "SvcgLOBCd": "CA", "User": "user", "phone": "yyyy, "accountLast": "tttt", "userName": "LP", "Company": "bbbb", "firstName": "Ryan" } }' 

現在,當我休息客戶端拋出任何異常像404或連接超時異常和消息之間的HTTP回去兔隊列HTTP代碼HTTP客戶端處理器| HTTP-客戶端

我的理解是連接超時異常將放回隊列和其他任何異常或200將消息移動到下一個組件它是http-client | log.But當我嘗試它時,所有異常都放回了http | http-client之間的隊列。

現在我的用例是我想重試所有套接字時間/連接超時異常。其他系統異常50x錯誤我想寫入日誌或文件接收器?我如何實現這一點。基本上取決於我想要的異常路由重試和非重試異常。

回答

1

只有2xx結果將轉到log

4xx5xx被認爲是錯誤。

您將需要一個自定義http-client模塊來捕捉您認爲'ok'的異常並將它們轉發到output頻道。類似...

<int:service-activator input-channel="input" ref="gw" /> 

<int:gateway request-channel="toHttp" error-channel="errors" /> 

<int:chain input-channel="errors" output-channel="output"> 
    <!-- examine payload.cause (http status code etc) and decide whether 
     to throw an exception or return the status code for sending to output --> 
</int:chain> 
+0

喜加里我們如下嘗試,但我們面臨的問題,下面 – constantlearner

+0

唐說作爲另一個答案,不要發表澄清,而是編輯你的問題。問題是你正在向網關返回null,它將永遠等待答覆。過濾後向網關添加'default-reply-timeout =「0」'以釋放線程。 –

+0

這工作表示感謝! – constantlearner

0

我們嘗試按照上面的建議實施。它現在過濾4XX錯誤並將有效載荷發送到下一個模塊。然而這些消息在內部兔子mq中未被確認。變更後2XX也不會發生確認。在更改之前,2XX確認正在發生。 5XX重試繼續發生很好。請讓我們知道如何克服這一點。

這裏是上下文XML

<service-activator input-channel="inputX" ref="gw" /> 

<gateway id="gw" default-request-channel="toHttp" error-channel="errors" /> 

<beans:bean id="responseInterceptor" class="com.batch.httpclient.ResponseInterceptor"> 
</beans:bean> 

<chain input-channel="errors" output-channel="output"> 
<transformer ref="responseInterceptor" /> 
</chain> 


<int-http:outbound-gateway id='batch-http' header-mapper="headerMapper" 
          request-channel='toHttp' url-expression="${url}" http-method="${httpMethod}" 
          expected-response-type='java.lang.String' charset='${charset}' 
          reply-timeout='${replyTimeout}' reply-channel='output'> 
</int-http:outbound-gateway> 

<beans:bean id="headerMapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper" 
      factory-method="outboundMapper"> 
    <beans:property name="outboundHeaderNames" value="*"/> 
    <beans:property name="userDefinedHeaderPrefix" value=""/> 
</beans:bean> 

<channel id="output" /> 
<channel id="input" /> 
<channel id="inputX" /> 
<channel id="toHttp" /> 

而對於ResponseInterceptor Java代碼看起來是這樣的 -

public Message<String> transform(ErrorMessage errorMessage) { 


     if(null != errorMessage && null != errorMessage.getPayload() && null != errorMessage.getPayload().getCause() 
       && null != errorMessage.getPayload().getCause().getMessage()){ 
      String rootCause = errorMessage.getPayload().getCause().getMessage(); 
      //check if the error message contains 400 or 404 http code. 
      if(rootCause.contains("400") || rootCause.contains("404")){ 
       return MessageBuilder.withPayload(errorMessage.getPayload().getCause().getMessage()) 
         .copyHeaders(errorMessage.getHeaders()) 
         .removeHeader("errorChannel") 
         .removeHeader("replyChannel") 
         .setReplyChannelName("output").setErrorChannelName(null).build(); 
      } 

     } 
     return null; 
    } 

}