JAX-WS 웹 서비스에서 MTOM 사용으로 설정

JAX-WS(Java™ API for XML-Based Web Services)에서 이미지 또는 파일과 같은 2진 첨부 파일을 웹 서비스 요청과 함께 전송할 수 있습니다. JAX-WS는 SOAP MTOM(Message Transmission Optimization Mechanism) 스펙에서 지정한 대로 2진 데이터의 최적화된 전송을 위한 지원을 추가합니다.

이 태스크 정보

JAX-WS는 2진 첨부 데이터 전송을 위한 SOAP MTOM(Message Transmission Optimized Mechanism) 사용을 지원합니다. MTOM을 사용으로 설정하면 XML 문서에 2진 데이터를 임베드하는 데 필요한 데이터 인코딩 비용을 발생시키지 않으면서 2진 데이터를 최적으로 전송하고 수신할 수 있습니다.

애플리케이션 서버는 JAX-WS 애플리케이션 전용 MTOM을 사용한 첨부 파일 전송을 지원합니다. 이 제품은 새 MTOM 및 XOP 표준을 사용하여 웹 서비스 보안 SOAP 메시지와 함께 첨부 파일을 전송할 수 있는 기능을 제공합니다.

JAX-WS 애플리케이션은 XML 문서에 포함된 base64 또는 hexBinary 인코딩된 데이터로 2진 데이터를 전송할 수 있습니다. 그러나 MTOM에서 제공하는 최적화를 이용하려면 MTOM을 사용으로 설정하여 2진 base64 데이터를 XML 문서 외부에 포함된 첨부 파일로 전송하십시오. MTOM 최적화는 기본적으로 사용으로 설정되지 않습니다. JAX-WS 애플리케이션에서는 MTOM 지원이 가능하도록 클라이언트 및 서버 아티팩트 둘 다를 개별적으로 구성해야 합니다.

프로시저

  1. JAX-WS 애플리케이션에 대해 2진 첨부를 포함하는 웹 서비스 애플리케이션 데이터를 나타내는 WSDL(Web Services Description Language) 파일 또는 XML 스키마 포함 Java 아티팩트를 개발하십시오.
    1. WSDL 파일을 사용하여 시작하는 경우, wsimport 명령을 통해 WSDL 파일에서 Java 아티팩트를 개발하여 필요한 JAX-WS 이식 가능 아티팩트를 생성하십시오.
    2. JavaBeans 컴포넌트를 사용하여 시작하는 경우 JAX-WS 애플리케이션에 대한 Java 아티팩트를 개발하고 wsgen 명령을 사용하여 선택적으로 WSDL 파일을 생성하십시오. XML 스키마 또는 WSDL 파일은 2진 데이터에 대한 xsd:base64Binary 또는 xsd:hexBinary 요소 정의를 포함합니다.
    3. 또한 해당 요소에 xmime:expectedContentTypes 속성을 포함시켜 JAXB에 의한 맵핑에 영향을 미칠 수도 있습니다.
  2. 다음 메소드 중 하나를 사용하여 엔드포인트 구현 클래스에서 MTOM을 사용으로 설정하십시오.
    • 엔드포인트에서 @MTOM 어노테이션을 사용하십시오.

      엔드포인트에서 MTOM을 사용으로 설정하려면 엔드포인트에서 @MTOM(javax.xml.ws.soap.MTOM) 어노테이션을 사용하십시오. @MTOM 어노테이션에는 두 개의 매개변수인 enabledthreshold가 있습니다. enabled 매개변수는 부울 값을 가지며 JAX-WS 엔드포인트에 대해 MTOM이 사용으로 설정되는지를 표시합니다. threshold 매개변수는 정수 값을 가지며 이 값은 0보다 크거나 같아야 합니다. MTOM이 사용으로 설정되는 경우 크기(바이트)가 임계값을 초과하는 모든 2진 데이터는 XOP(XML-binary Optimized Packaging)로 인코딩되거나 첨부로 전송됩니다. 메시지 크기가 임계값 미만이면 메시지가 XML 문서에서 base64 또는 hexBinary 데이터로 인라인 지정됩니다.

      다음 스니펫 예에서는 JAX-WS MyServiceImpl 엔드포인트에 대해 MTOM이 사용으로 설정되도록 @MTOM 어노테이션을 추가하는 것을 보여주고 2048바이트의 임계값을 지정합니다.
      @MTOM(enabled=true, threshold=2048)
      @WebService
      public class MyServiceImpl {
      ...
      }
      또한 엔드포인트 구현 클래스에서 @BindingType(javax.xml.ws.BindingType) 어노테이션을 사용하여 응답 메시지가 MTOM 사용 설정되도록 하기 위해 엔드포인트가 MTOM 바인딩 유형 중 하나를 지원하도록 지정할 수 있습니다. javax.xml.ws.SOAPBinding 클래스는 @BindingType 어노테이션 값에 사용할 수 있는 두 가지 서로 다른 상수 SOAP11HTTP_MTOM_BINDINGSOAP12HTTP_MTOM_BINDING을 정의합니다. 예를 들면, 다음과 같습니다.
      // This example is for SOAP version 1.1.
      @BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING)
      @WebService
      public class MyServiceImpl {
      ...
      }
      // This example is for SOAP version 1.2.
      @BindingType(value = SOAPBinding.SOAP12HTTP_MTOM_BINDING)
      @WebService
      public class MyServiceImpl {
      ...
      }

      @MTOM 어노테이션의 표시 및 값이 @BindingType 어노테이션의 값을 대체합니다. 예를 들어, @BindingType이 MTOM 사용 설정됨을 표시하지만 @MTOM 어노테이션이 enabled 값을 false로 표시하는 경우 이 MTOM은 사용 불가능합니다.

    • <enable-mtom><mtom-threshold> 배치 디스크립터 요소를 사용하십시오.
      서비스 엔드포인트 구현 클래스에서 @MTOM 어노테이션을 사용하는 대신에 webservices.xml 배치 디스크립터의 <port-component> 요소에서 <enable-mtom><mtom-threshold> 요소를 사용할 수 있습니다. 예를 들면, 다음과 같습니다.
      <port-component>
      			<port-component-name>MyPort1</port-component-name>
      			<enable-mtom>true</enable-mtom>
      			<mtom-threshold>2048</mtom-threshold>
      			<service-impl-bean>
      				<servlet-link>MyPort1ImplBean</servlet-link>
      			</service-impl-bean>
      </port-component>
      문제점 방지 문제점 방지: 배치 디스크립터 요소가 MTOM 어노테이션의 해당 속성에 우선합니다. 예를 들어, 어노테이션에서 enabled 속성이 true로 설정되지만 webservices.xml 파일에서 <enable-mtom> 요소가 false로 설정되는 경우 해당 엔드포인트에 대해 MTOM이 사용으로 설정되지 않습니다. gotcha
  3. 클라이언트에서 MTOM을 사용으로 설정하여 클라이언트에서 서버로 전송되는 2진 메시지를 최적화하십시오. 다음 메소드 중 하나를 사용하여 클라이언트에서 MTOM을 사용으로 설정하십시오.
    • 디스패치 클라이언트에서 MTOM을 사용으로 설정하십시오.
      참고: 디스패치 클라이언트의 경우 클라이언트 애플리케이션은 최적화된 형식으로 SOAP 메시지를 구성해야 합니다.

      다음 예에서는 SOAP 버전 1.1을 사용합니다.

      첫 번째 메소드는 SOAPBinding.setMTOMEnabled()를 사용합니다. 예를 들면, 다음과 같습니다.
      SOAPBinding binding = (SOAPBinding)dispatch.getBinding();
          binding.setMTOMEnabled(true);
      두 번째 메소드는 Service.addPort를 사용합니다. 예를 들면, 다음과 같습니다.
          Service svc = Service.create(serviceName);
          svc.addPort(portName,SOAPBinding.SOAP11HTTP_MTOM_BINDING,endpointUrl); 
      세 번째 메소드는 MTOMFeature를 사용합니다. 예를 들면, 다음과 같습니다.
         MTOMFeature mtom = new MTOMFeature(true, 2048);
          Service svc = Service.create(serviceName);
          svc.addPort(portName, SOAPBinding.SOAP11_HTTP_BINDING, endpointUrl);
          Dispatch<Source> dsp = svc.createDispatch(portName, Source.class, Service.Mode.PAYLOAD, mtom);
    • 동적 프록시 클라이언트에서 MTOM을 사용으로 설정하십시오.
      // Create a BindingProvider bp from a proxy port.
        Service svc = Service.create(serviceName);
        MtomSample proxy = svc.getPort(portName, MtomSample.class);
        BindingProvider bp = (BindingProvider) proxy;
        
        //Enable MTOM using the SOAPBinding.
        MtomSample proxy = svc.getPort(portName, MtomSample.class);
        BindingProvider bp = (BindingProvider) proxy;
        SOAPBinding binding = (SOAPBinding) bp.getBinding();
        binding.setMTOMEnabled(true);
      
        //Or, you can enable MTOM with the MTOMFeature.
        MTOMFeature mtom = new MTOMFeature();
        MtomSample proxy = svc.getPort(portName, MtomSample.class, mtom);
    • @MTOM 어노테이션을 사용하여 클라이언트에서 MTOM을 사용으로 설정하십시오. 예를 들면, 다음과 같습니다.
      public class MyClientApplication {
      
          // Enable MTOM for a port-comonent-ref resource injection.
      	    @MTOM(enabled=true, threshold=1024)
      	    @WebServiceRef(MyService.class)
      	    private MyPortType myPort;
          ...
      }
    • port-component-ref 요소 내의 배치 디스크립터 요소를 사용하여 클라이언트에서 MTOM을 사용으로 설정하십시오. 예를 들면, 다음과 같습니다.
      <service-ref>
          <service-ref-name>service/MyPortComponentRef</service-ref-name>
          <service-interface>com.example.MyService</service-ref-interface>
          <port-component-ref>
              <service-endpoint-interface>com.example.MyPortType</service-endpoint-interface>
              <enable-mtom>true</enable-mtom>
              <mtom-threshold>1024</mtom-threshold>
          </port-component-ref>
      </service-ref>
      문제점 방지 문제점 방지: 배치 디스크립터 요소가 MTOM 어노테이션의 해당 속성에 우선합니다. 예를 들어, 어노테이션에서 enabled 속성이 true로 설정되지만 클라이언트의 service-ref에 대한 배치 디스크립터 항목에서 <enable-mtom> 요소가 false로 설정되는 경우 서비스 참조에 대해 MTOM이 사용으로 설정되지 않습니다. gotcha

결과

MTOM을 사용하여 2진 데이터를 최적으로 전송 및 수신하는 JAX-WS 웹 서비스 서버 및 클라이언트 애플리케이션을 개발했습니다.

다음 예에서는 WSDL 파일을 사용하여 시작할 때 웹 서비스 클라이언트 및 서버 엔드포인트 둘 다에서 MTOM 지원을 사용으로 설정하는 것을 보여줍니다.

  1. xsd:base64Binary 요소가 들어 있는 WSDL 파일을 찾으십시오. 다음 예는 xsd:base64Binary 요소를 포함하는 WSDL 파일 부분입니다.
      <types>
        ........
        <xs:complexType name="ImageDepot">
            <xs:sequence>
                <xs:element name="imageData" 
                            type="xs:base64Binary"                        
                            xmime:expectedContentTypes="image/jpeg"/>
    
            </xs:sequence>
        </xs:complexType>
        ........
    </types>
  2. WSDL 파일에 대해 app_server_root\bin\ 디렉토리에서 wsimport 명령을 실행하여 일련의 JAX-WS 이식 가능 아티팩트를 생성하십시오.
    [Windows]
    app_server_root\bin\wsimport.bat <wsdl_url>
    [AIX][HP-UX][Linux][Solaris]
    app_server_root/bin/wsimport.sh <wsdl_url>
    WSDL 파일에 포함된 expectedContentTypes 값에 따라 생성된 JAXB 아티팩트는 다음 테이블에 설명된 대로 Java 유형입니다.
    표 1. MIME 유형 및 Java 유형의 맵핑. MIME 유형과 Java 유형 사이의 맵핑에 대해 설명합니다.
    MIME 유형 Java 유형
    image/gif java.awt.Image
    image/jpeg java.awt.Image
    text/plain java.lang.String
    text/xml javax.xml.transform.Source
    application/xml javax.xml.transform.Source
    */* javax.activation.DataHandler
  3. 다른 JAX-WS 애플리케이션과 같은 방식으로 JAXB 아티팩트를 사용하십시오. 이러한 Bean을 사용하여 디스패치 및 동적 프록시 클라이언트 API 둘 다에서 2진 데이터를 전송하십시오.
  4. 디스패치 클라이언트에서 MTOM을 사용으로 설정하십시오.
    //Create the Dispatch instance.
            JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom");
            Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD);
    
    //Enable MTOM.
            SOAPBinding binding = (SOAPBinding) dispatch.getBinding();
            binding.setMTOMEnabled(true);
  5. 동적 프록시 클라이언트에서 MTOM을 사용으로 설정하십시오.
    //Create the Dynamic Proxy instance.
            Service svc = Service.create(serviceName);
            MtomSample proxy = svc.getPort(portName, MtomSample.class);
    
    //Enable MTOM.
            BindingProvider bp = (BindingProvider) proxy;
            SOAPBinding binding = (SOAPBinding) bp.getBinding();
            binding.setMTOMEnabled(true);
    MTOM에 대해 JAX-WS 클라이언트가 사용으로 설정되었으므로 서버에 전송된 메시지가 MTOM 사용으로 설정됩니다. 그러나 서버가 MTOM을 사용하여 클라이언트에게 응답하게 하려면 엔드포인트에서 MTOM을 사용으로 설정해야 합니다.
  6. 엔드포인트 구현 클래스에서 MTOM을 사용으로 설정하십시오.
    @MTOM(enabled, threshold=4096)
    @WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample")
    
    public class MtomSampleService implements MtomSample {
       ....
    }
    jaxax.xml.ws.SOAPBinding 클래스에는 지원되는 바인딩 유형 각각에 대한 정적 멤버가 있습니다. SOAP11HTTP_MTOM_BINDING 또는 SOAP12HTTP_MTOM_BINDING 중 하나를 @BindingType 어노테이션에 대한 값으로 포함시키십시오. 이 값은 모든 서버 응답에서 MTOM이 사용으로 설정되도록 합니다.

서버 및 클라이언트에서 MTOM을 사용으로 설정하는 경우 첨부를 나타내는 2진 데이터는 SOAP 메시지에 대한 MIME(Multipurpose Internet Mail Extensions) 첨부로서 포함됩니다. MTOM을 사용하지 않으면, 동일한 데이터가 XML 스키마(base64 또는 16진 인코딩)를 설명하는 형식으로 인코딩되어 XML 문서에 인라인으로 포함됩니다.

이 예는 첨부가 있는 MTOM 사용 SOAP 버전 1.1 메시지를 보여줍니다. typecontent-type 속성 둘 다의 값은 application/xop+xml이며 이 값은 MTOM이 사용으로 설정된 경우 메시지가 XOP(XML-binary Optimized packaging)를 사용하여 성공적으로 최적화됨을 표시합니다. 다음 예는 최적화된 메시지가 MTOM이 사용으로 설정된 연결에서 표시되는 방식을 보여줍니다.
... other transport headers ... 
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812; 
type="application/xop+xml"; start="
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8

--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id: 
   <0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>

<?xml version="1.0" encoding="UTF-8"?>
         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Header/>
            <soapenv:Body>
               <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
                  <input>
                     <imageData>
                        <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" 
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
                     </imageData>
                  </input>
               </sendImage>
            </soapenv:Body>
         </soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id: 
         <1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>

… binary data goes here …
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
반대로 다음 예는 MTOM이 사용으로 설정되지 않은 연결에서의 SOAP 버전 1.1 메시지를 보여줍니다. 2진 데이터는 SOAP 메시지 본문에 포함되고 SOAP 메시지가 최적화되지 않습니다.
... other transport headers ... 
Content-Type: text/xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header/>
      <soapenv:Body>
         <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
            <input>
               <imageData>R0lGADl ... more base64 encoded data ... KTJk8giAAA7</imageData>
            </input>
         </sendImage>
      </soapenv:Body>
   </soapenv:Envelope>

추가 정보는 Information Center의 샘플 섹션을 참조하십시오. 이 섹션에는 JAX-WS 웹 서비스에서 MTOM을 사용하는 것을 보여주는 샘플이 있습니다.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_enablemtom
파일 이름:twbs_enablemtom.html