2017-01-17 13 views
0

약 1 또는 2 기가 바이트라고하는 거대한 SOAP 메시지 (멀티 파트, MTOM)를 보내야합니다. 는 때때로 프로세스는 다음 OOM과 끝 :SAAJ의 IBM 구현에 의한 힙 오버플로

내 이해로
java.lang.OutOfMemoryError: Java Heap Space 
at java.util.Arrays.copyOf(Arrays.java:2479) 
at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:203) 
at com.ibm.ws.webservices.engine.transport.channel.OutboundOutputStream.toByteArray(OutboundOutputStream.java:100) 
at com.ibm.ws.webservices.engine.transport.http.HttpOutboundChannelConnection.prepareHttpRequestHeaders(HttpOutboundChannelConnection.java:2027) 
at com.ibm.ws.webservices.engine.transport.http.HttpOutboundChannelConnection.sendSOAPRequest(HttpOutboundChannelConnection.java:374) 
at com.ibm.ws.webservices.engine.transport.http.HTTPSender.invoke(HTTPSender.java:745) 
at com.ibm.ws.webservices.engine.PivotHandlerWrapper.invoke(PivotHandlerWrapper.java:264) 
at com.ibm.ws.webservices.engine.PivotHandlerWrapper.invoke(PivotHandlerWrapper.java:264) 
at com.ibm.ws.webservices.engine.WebServicesEngine.invoke(WebServicesEngine.java:336) 
at com.ibm.ws.webservices.engine.client.Connection.invokeEngine(Connection.java:970) 
at com.ibm.ws.webservices.engine.client.Connection.invoke(Connection.java:761) 
at com.ibm.ws.webservices.engine.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:223) 
at com.ibm.ws.webservices.engine.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:163) 

문제 때문에 정말 큰 스트림 작업을 할 때 부적절 보이는있는 ByteArrayOutputStream를 사용하는 것입니다.

스택 추적 다음에 힙에 전체 메시지 내용 (바이트 배열로)이 적어도 2 사본 필요합니다.

그래서 힙 소비를 통해 SAAJ를 더 잘 구현할 수 있는지 아는 사람이 있습니까? SAAJ의 IBM 구현에 대한 해결 방법이 있습니까?

답변

1

IBM의 SAAJ 구현이 전적으로 braindead가 아니라고 가정하면 HTTP 청크가 활성화되어 있지 않고 메시지를 보내기 전에 메시지의 길이를 계산해야하는 경우에만 메시지를 바이트 배열로 변환 할 것으로 기대합니다. 따라서 가장 먼저 할 일은 청킹이 활성화되어 있는지 확인하는 것입니다.

나는 SAAJ는 청크 가능하게하는 표준 방법을 정의 생각하지 않는다, 그러나 당신은 메시지에 대응하는 HTTP 헤더 설정을 시도 할 수 있습니다 :

soapMessage.getMimeHeaders().addHeader("Transfer-Encoding", "chunked"); 

기회는 SAAJ 구현이 명예 것입니다.

+0

청킹이 활성화되어 있지 않고 Content-Length 헤더가 현재까지 존재하므로 동일한 생각을했습니다. 그러나 나는 거기에 덩어리들을 강제하는 방법에 대해 명확한 생각이 없습니다. 요청시 선언 된 프로토콜은 HTTP1.1이므로 오히려 가능해야합니다. – user3714601

+0

청킹을 사용하도록 설정해야하는 제안에 대한 답변을 업데이트했습니다. –

+0

불행히도 아니오, 우리가 그러한 헤더를 직접 설정하려고 시도하면 아무런 효과가 없습니다. 슬픈, 마침내 우리는 SAAJ에서 거대한 메시지를 올바르게 처리하는 JAX-WS로 전환해야했습니다. – user3714601