アプリ A がアプリ B に取得要求を送信し、アプリ B が外部 http アプリに接続して情報を取得する 1 台のマシンで 2 つのミュール アプリケーションを実行しています。基本的にアプリBはリダイレクトアプリで、1日に何度も接続タイムアウト例外(java.net.SocketTimeoutException)を投げます。私の観察によると、これはアプリケーション(B)がしばらくアイドル状態のときに発生し、リクエストを受信すると、アウトバウンドhttpエンドポイントで外部サーバーに接続しているときに最初のリクエストの接続タイムアウトがスローされ、後続のリクエストは正常に機能します.これデバッグにアクセスできない1つの環境でのみ発生し、まったく同じセットアップの2つの環境がありますが、他の環境ではこの問題に遭遇していません。
問題をデバッグする際に、ヘルプ/提案/ガイドがあれば幸いです。コード
<flow name="Main" >
<https:inbound-endpoint exchange-pattern="request-response"
host="${http.listenHost}" port="${support-1.0.https.port}"
path="${service.root}" encoding="UTF-8"
doc:name="HTTP" connector-ref="HTTPSConnector">
<!-- NB: SECURITY TURNED OFF BY DEFAULT AS YOU WILL NEED TO ADD RECORDS
TO THE DATABASE IN ORDER TO USE THIS -->
<!-- <mule-ss:http-security-filter realm="mule-realm"/> -->
</https:inbound-endpoint>
<custom-interceptor class="xyz.BasicLogger">
<spring:property name="outermost" value="true" />
</custom-interceptor>
<set-session-variable variableName="operation" value="#[message.inboundProperties['http.method']]" doc:name="Operation"/>
<set-variable variableName="_logging.text" value="Incoming Payload" doc:name="Logging" />
<component doc:name="Payload Logger">
<spring-object bean="idPayloadLogger" />
</component>
<set-session-variable variableName="http.status"
value="200" doc:name="HTTP Status" />
<flow-ref name="Cache" doc:name="Cache"/>
<http:response-builder status="#[sessionVars['http.status']]" contentType="application/json" doc:name="HTTP Response Builder">
<http:header name="consumerTransId" value="#[sessionVars['tx.id']]"/>
<http:header name="http.status" value="#[sessionVars['http.status']]"/>
<http:header name="Content-Type" value="application/json;charset=utf-8"/>
</http:response-builder>
</flow>
<flow name="Cache">
<expression-transformer expression="#[payload]" doc:name="Create key for cache"/>
<custom-interceptor doc:name="PayloadCache" class="xyz.ehcache.PayloadCache"/>
<flow-ref name="GetResult" doc:name="GetResult"/>
</flow>
<sub-flow name="GetResult">
<choice doc:name="Choice">
<when expression="sessionVars.operation =='GET'">
<processor-chain doc:name="GET">
<set-variable variableName="_logging.calloutName " value="Registry GET" doc:name="_logging.calloutName "/>
<component doc:name="Java"><spring-object bean="idTimerLogger"/></component>
<http:outbound-endpoint exchange-pattern="request-response" host="${registry.host}" port="${registry.port}"
path="${registry.path}/#[message.inboundProperties.'http.relative.path']?#[message.inboundProperties.'http.query.string']" method="GET" doc:name="HTTP" responseTimeout="10000"/>
<component doc:name="Java"><spring-object bean="idTimerLogger"/></component>
</processor-chain>
</when>
<when expression="sessionVars.operation =='DELETE'">
<processor-chain doc:name="DELETE">
<set-variable variableName="_logging.calloutName " value="Registry DELETE" doc:name="_logging.calloutName "/>
<component doc:name="Java"><spring-object bean="idTimerLogger"/></component>
<http:outbound-endpoint exchange-pattern="request-response" host="${registry.host}" port="${registry.port}" path="${registry.path}/#[message.inboundProperties.'http.relative.path']?#[message.inboundProperties.'http.query.string']"
method="DELETE" doc:name="HTTP"/>
<component doc:name="Java"><spring-object bean="idTimerLogger"/></component>
</processor-chain>
</when>
<otherwise>
<processor-chain doc:name="Unsupported Verb">
<set-variable variableName="_error.code" value="2" doc:name="Error code"/>
<custom-transformer class="xyz.eai.utility.transformation.ErrorMessageTransformer" doc:name="Java"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</processor-chain>
</otherwise>
</choice>
<object-to-string-transformer doc:name="Object to String"/>
</sub-flow>
</mule>
エラーは `
Exception stack is:
1. connect timed out (java.net.SocketTimeoutException)
java.net.PlainSocketImpl:-2 (null)
2. The host did not accept the connection within timeout of 2000 ms (org.apache.commons.httpclient.ConnectTimeoutException)
org.apache.commons.httpclient.protocol.ReflectionSocketFactory:155 (null)
3. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=http://xyz.ca.com:8080/search?param1=xyz¶m2=true, connector=HttpConnector
{
name=connector.http.mule.default
lifecycle=start
this=59c02565
numberOfConcurrentTransactedReceivers=4
createMultipleTransactedReceivers=true
connected=true
supportedProtocols=[http]
serviceOverrides=<none>
}
, name='endpoint.http.xyz.com.8080.search.param1.xyz.param2.true', mep=REQUEST_RESPONSE, properties={isActive=true, http.method=GET, exceptionOnMessageError=true, param1=xyz}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: GetMethod (org.mule.api.transport.DispatchException)
org.mule.transport.http.HttpClientMessageDispatcher:151 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)`
################3
アプリ B のアウトバウンド HTTP エンドポイントに成功するまでループを追加し、個別にアクセスしている場合は機能しています。しかし、アプリ A がアプリ B と通信しようとすると、アプリ B が外部サーバーに接続して応答を返す前であっても、アプリ A の http 送信エンドポイントがスローorg.mule.api.transport.DispatchException with message : Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=https://application-b/xyz, connector=HttpsConnector
され、アプリ B が再試行を完了して送信を試みると、エラーが発生したアプリ A への応答を返します。org.mule.transport.http.HttpsMessageProcessTemplate: Exception sending http response after error: Connection has been shutdown: javax.net.ssl.SSLException: java.net.SocketException: Software caused connection abort: socket write error