2016-08-24 1 views
1

IBM WebSphere Application Server에서 제공하는 일부 PUT/POST API를 호출해야하는 많은 Linux 서버에서 자동 크론 작업을 설정 중입니다. (8.5.5). 자바에서 내 자신의 REST 클라이언트를 작성했지만 이상하게도 때때로 API 실행이 예외로 중단됩니다.페이로드가 특정 크기를 초과하면 예외 "비동기 작업 시간 초과"Java REST API 호출이 실패합니다.

com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[JAX-RS Servlet]: java.net.SocketTimeoutException: Async operation timed out 
    at com.ibm.ws.tcp.channel.impl.AioTCPReadRequestContextImpl.processSyncReadRequest(AioTCPReadRequestContextImpl.java:191) 
    at com.ibm.ws.tcp.channel.impl.TCPReadRequestContextImpl.read(TCPReadRequestContextImpl.java:111) 
    at com.ibm.ws.http.channel.impl.HttpServiceContextImpl.fillABuffer(HttpServiceContextImpl.java:4212) 
    at com.ibm.ws.http.channel.impl.HttpServiceContextImpl.readSingleBlock(HttpServiceContextImpl.java:3440) 
    at com.ibm.ws.http.channel.impl.HttpServiceContextImpl.readBodyBuffer(HttpServiceContextImpl.java:3546) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundServiceContextImpl.getRequestBodyBuffer(HttpInboundServiceContextImpl.java:1822) 
    at com.ibm.ws.webcontainer.channel.WCCByteBufferInputStream.bufferIsGood(WCCByteBufferInputStream.java:371) 
    at com.ibm.ws.webcontainer.channel.WCCByteBufferInputStream.read(WCCByteBufferInputStream.java:265) 
    at com.ibm.ws.webcontainer.srt.http.HttpInputStream.read(HttpInputStream.java:322) 
    at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:464) 
    at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:506) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:234) 
    at java.io.InputStreamReader.read(InputStreamReader.java:188) 
    at com.ibm.json.java.JSONArray.parse(JSONArray.java:150) 
    at com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider.readFrom(JSON4JArrayProvider.java:44) 
    at com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider.readFrom(JSON4JArrayProvider.java:25) 
    at org.apache.wink.server.internal.registry.ServerInjectableFactory$EntityParam.getValue(ServerInjectableFactory.java:197) 
    at org.apache.wink.common.internal.registry.InjectableFactory.instantiate(InjectableFactory.java:68) 
    at org.apache.wink.server.internal.handlers.CreateInvocationParametersHandler.handleRequest(CreateInvocationParametersHandler.java:44) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:188) 
    at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.handlers.OptionsMethodWADLHandler.handleRequest(OptionsMethodWADLHandler.java:51) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 
    at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75) 
    at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:60) 
    at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207) 
    at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154) 
    at org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:124) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1071) 
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87) 
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:909) 
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662) 
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283) 
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175) 
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862) 
Caused by: com.ibm.io.async.AsyncTimeoutException(Async operation timed out, [Timeout, rc=0]) 
    at com.ibm.io.async.AbstractAsyncFuture.waitForCompletion(AbstractAsyncFuture.java:359) 
    at com.ibm.io.async.AsyncFuture.getByteCount(AsyncFuture.java:218) 
    at com.ibm.ws.tcp.channel.impl.AioSocketIOChannel.readAIOSync(AioSocketIOChannel.java:215) 
    at com.ibm.ws.tcp.channel.impl.AioTCPReadRequestContextImpl.processSyncReadRequest(AioTCPReadRequestContextImpl.java:184) 
    ... 78 more 

이것은 일부 Linux 서버에서만 발생했으며 내 Windows 워크 스테이션에서 개발할 때 완벽하게 작동했습니다. 따라서 WAS 서버의 시간 초과 설정에 문제가 없어야합니다. 나는

curl -vX PUT http://<was_server_ip>:9081/RTCWebClient/v0.1/api/testResult/syncTestSuites?testCategory=Kitchen -d @test.json --header "Content-Type: application/json" 

아래로 컬을 사용하여 디버깅하기 위해 노력하고 페이로드가 1306 바이트 (아래 컬 출력 콘텐츠 길이 참조), API가 매달려 시작 초과 예외를 언급 위-줄 때 알게되었습니다.

> PUT /RTCWebClient/v0.1/api/testResult/syncTestSuites?testCategory=Kitchen 
HTTP/1.1 
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 
> Host: 9.51.163.190:9081 
> Accept: */* 
> Content-Type: application/json 
> Content-Length: 1307 
> Expect: 100-continue 
> 
< HTTP/1.1 100 Continue 
< Content-Length: 0 
< Date: Wed, 24 Aug 2016 07:35:23 GMT 
< HTTP/1.1 500 Internal Server Error 
< Date: Wed, 24 Aug 2016 07:35:23 GMT 
< X-Powered-By: Servlet/3.0 
< Content-Type: text/html;charset=ISO-8859-1 
< $WSEP: 
< Content-Language: en-US 
< Content-Length: 102 
< Connection: Close 
< 
Error 500: javax.servlet.ServletException: java.net.SocketTimeoutException: Async operation timed out 
* Closing connection #0 

페이로드가 1307 바이트보다 작 으면 API가 제대로 실행됩니다.

> PUT /RTCWebClient/v0.1/api/testResult/syncTestSuites?testCategory=Kitchen HTTP/1.1 
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2 
> Host: 9.51.163.190:9081 
> Accept: */* 
> Content-Type: application/json 
> Content-Length: 1306 
> Expect: 100-continue 
> 
< HTTP/1.1 100 Continue 
< Content-Length: 0 
< Date: Wed, 24 Aug 2016 07:37:51 GMT 
< HTTP/1.1 200 OK 
< Date: Wed, 24 Aug 2016 07:37:51 GMT 
< X-Powered-By: Servlet/3.0 
< Content-Type: application/json 
< Access-Control-Allow-Headers: application/json 
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
< Access-Control-Allow-Origin: * 
< Content-Language: en-US 
< Transfer-Encoding: chunked 
< 
* Connection #0 to host 9.51.163.190 left intact 
* Closing connection #0 
{"Identifier":"syncTestSuites completed","Result":{"Newly Added Test Suites":[]}} 

문제가있는 Linux 시스템에서 어떤 설정으로 인해 발생할 수 있는지 관리자에게 문의해야합니다. 또한 누군가에게이 문제에 대한 사려 깊은 통찰력을 줄 수 있는지 여기에 게시하고 있습니다.

+0

관련 스택 질문에 아직 답하지 않았습니다. 1. [비동기 작업 시간 초과] (http://stackoverflow.com/questions/35476406/async-operation-timed-out) 2. [요청이 제대로 제출되지 않았습니다.] (http://stackoverflow.com/questions/ 36810130/request-not-getting-getting-submitted-properly-ww-gettingexception-java-net-sockett) –

+1

"비동기 작업 시간 초과"는 WebSphere의 "응답을받지 못했습니다"라고 생각합니다. 그러나 메시지 크기에 따라 다르다는 것은 이상한 일입니다. 메가 바이트를 보내는 것과는 다릅니다. pcap 또는 wireshark를 사용하여 통신의 진행 상황을 확인할 수 있습니다. –

답변

0

문제는 오래 전에 해결되었지만 여기에서 업데이트하는 것을 잊었습니다.

WAS 애플리케이션 서버의 MTU 크기를 1500 비트에서 1320으로 낮추면 문제가 사라졌습니다. 네트워크 관리자에 따르면, 이로 인해 서버의 데이터 세그먼트가 조금 더 작아 졌으므로 일부 응용 프로그램이 더 나은 방식으로 데이터를 처리 할 수있었습니다.

다음은 최대 전송 단위 https://craigocon.wordpress.com/2012/10/03/whats-mtu-and-how-do-i-change-it-in-windows-2008-r2/에 대한 아주 좋은 블로그 기사입니다.

저는 네트워크 지식에 완전히 익숙하지 않아 네트워크 팀의 지원을 받고있어서 기쁩니다.

관련 문제