사용을 안내하는 여기에 나열된 답변 SOAPHandler
은 완전히 정확합니다. SOAPHandler가 JAX-WS 스펙의 일부이므로이 방법의 이점은 모든 JAX-WS 구현에서 작동한다는 것입니다. 그러나 SOAPHandler의 문제점은 메모리에서 전체 XML 메시지를 암시 적으로 나타내려고 시도한다는 것입니다. 이로 인해 엄청난 메모리 사용이 발생할 수 있습니다. JAX-WS의 다양한 구현은 이에 대한 자체 해결 방법을 추가했습니다. 큰 요청이나 큰 응답으로 작업하는 경우 독점 접근 방식 중 하나를 조사해야합니다.
"JDK 1.5 이상에 포함 된 것"에 대해 질문하므로 JDK에 포함 된 JAX-WS RI (일명 Metro)에 대해 공식적으로 답변하겠습니다.
JAX-WS RI에는 메모리 사용 측면에서 매우 효율적인 특정 솔루션이 있습니다.
https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri를 참조 하십시오 . 불행히도이 링크는 끊어졌지만 WayBack Machine에서 찾을 수 있습니다. 아래에서 주요 내용을 알려 드리겠습니다.
2007 년 메트로 사람들은 Metro 에 독점적 인 추가 핸들러 유형을 도입 했습니다 MessageHandler<MessageHandlerContext>
. SOAPHandler<SOAPMessageContext>
인 메모리 DOM 표현을 시도하지 않는 것보다 훨씬 효율적 입니다.
원본 블로그 기사의 중요한 내용은 다음과 같습니다.
MessageHandler :
JAX-WS Specification에서 제공하는 확장 가능한 처리기 프레임 워크와 RI의 향상된 메시지 추상화를 활용 MessageHandler
하여 웹 서비스 응용 프로그램을 확장 하는 새로운 처리기를 도입했습니다 . MessageHandler는 SOAPHandler와 유사하지만 구현시 액세스가 가능하다는 점만 다릅니다.MessageHandlerContext
(MessageContext의 확장). MessageHandlerContext를 통해 Message API를 사용하여 Message에 액세스하고 처리 할 수 있습니다. 블로그 제목에 넣을 때이 핸들러를 사용하면 DOM 기반 메시지뿐만 아니라 메시지를 효율적으로 액세스 / 처리 할 수있는 메시지 작업을 수행 할 수 있습니다. 핸들러의 프로그래밍 모델은 동일하며 메시지 핸들러는 표준 논리 및 SOAP 핸들러와 혼합 될 수 있습니다. JAX-WS RI 2.1.3에 MessageHandler를 사용하여 메시지를 로그하는 샘플을 추가했으며 다음은 샘플의 스 니펫입니다.
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(2007 블로그 게시물에서 인용문 끝)
LoggingHandler
이 예제에서 사용자 지정 처리기 를 처리기 체인에 추가해야 효과를 얻을 수 있습니다. 이것은 other를 추가하는 것과 동일 하므로이 페이지 Handler
의 다른 답변 에서 방법을 찾을 수 있습니다.
Metro GitHub 리포지토리 에서 전체 예제 를 찾을 수 있습니다 .