JAX-RPC 웹 서비스 클라이언트 캐시 구성

JAX-RPC 웹 서비스 클라이언트 캐시는 애플리케이션 서버에 JAX-RPC("Java™ API for XML-Based Remote Procedure Call)" 핸들러로 제공됩니다. JAX-RPC 웹 서비스 클라이언트 캐시는 원격 웹 서비스에서 응답을 캐시하여 웹 서비스 클라이언트의 성능을 높이는 데 사용하는 동적 캐시 서비스의 일부입니다. JAX-RPC 웹 서비스 클라이언트 캐시를 구성하면 지정된 시간 동안 원격 웹 서비스에서 응답을 캐시하여 애플리케이션 서버 성능을 향상시킬 수 있습니다.

시작하기 전에

동적 캐시 서비스는 기본적으로 사용 가능합니다. 관리 콘솔에서 기본 캐시 인스턴스를 구성할 수 있습니다. 자세한 정보는 동적 캐시 서비스 사용의 내용을 참조하십시오. 웹 서비스 클라이언트 캐시를 구성하기 전에 기본 캐시 정책 작성 방법을 이해하십시오. 자세한 정보는 cachespec.xml 파일로 캐시 가능 오브젝트 구성의 내용을 참조하십시오.

이 태스크 정보

웹 서비스 클라이언트 캐시를 사용 가능하게 하는 것은 지정된 시간 동안 원격 웹 서비스로부터의 응답을 저장하기 위해 동적 캐시 서비스를 사용하여 시스템의 성능을 향상시키기 위한 옵션입니다. WebSphere Application Server 버전 6.1에서는 동적 캐시 서비스만 사용 가능하게 하면 웹 서비스 캐싱을 사용할 수 있습니다. 동적 캐시 서비스 및 서블릿 캐싱을 사용 가능하게 하면 웹 서비스 캐싱을 사용할 수 있습니다. 원격 웹 서비스에서 응답이 리턴된 후, 애플리케이션 서버의 클라이언트 캐시에 이 응답이 저장됩니다. 같은 원격 웹 서비스에 이루어진 동일한 요청은 모두 지정된 시간 동안 캐시에서 응답합니다. 웹 서비스 클라이언트 캐시는 대상 웹 서비스가 엔터프라이즈 네트워크의 외부에 있어서 클라이언트 캐싱을 인식하지 못할 수 있기 때문에 주로 시간 기준의 무효화를 사용합니다. 그러므로 캐시의 시간 및 클라이언트 애플리케이션의 캐시에 캐시 항목 ID를 빌드하는 규칙을 지정할 수 있습니다.

웹 서비스 클라이언트 캐시는 애플리케이션 서버에 JAX-RPC(Java API for XML-Based Remote Procedure Calls) 핸들러로 제공됩니다. 이 JAX-RPC 캐시 핸들러는 애플리케이션 클라이언트에서 핸들러를 통해 흐르는 SOAP 요청을 가로챕니다. 그런 다음 대상 웹 서비스에 따라 캐시 정책을 식별합니다. 정책을 찾은 후, 유효한 규칙을 발견할 때까지 모든 캐시 ID 규칙이 하나씩 평가됩니다.

프로시저

  1. 원격 서비스에 대한 WSDL(Web Services Description Language) 파일을 찾으십시오. WSDL 파일 부분에 캐시 정책 작성 시 사용할 정보가 있습니다. WSDL 파일에 대한 자세한 정보는 WSDL의 내용을 참조하십시오. 다음은 데모 목적을 위해 사용되는 값이 있는 WSDL 파일 일부의 예입니다.
    <definitions targetNamespace="http://TradeSample.com/"
    			xmlns:tns="http://com/ibm/was/wssample/sei/ping/"
    		xmlns="http://schemas.xmlsoap.org/wsdl/"
    				xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    				xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    		<message name="getQuoteRequest">
    				<part name="symbol" type="xsd:string"/>
    		  </message>
    .....
    .....
    <binding name="SoapBinding" type="tns:GetQuote">
    		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    				<operation name="getQuote">
    			<soap:operation soapAction=""/>
    						<input name="getQuoteRequest">
    								<soap:body namespace="http://TradeSample.com/" 
    								use="encoded"
    			encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</input>
    			......
    			</operation>
    </binding>
    <service name="GetQuoteService">
    		<port binding="tns:SoapBinding" name="SoapPort">
    				<soap:address location="http://TradeSample.com:9080/service/getquote"/>
    	</port>    
    </service> 
    </definitions>
    강조표시된 텍스트는 캐시 정책 작성 시 사용되는 값을 표시합니다.
  2. 웹 서비스 클라이언트 캐싱의 캐시 ID 생성 방법을 선택하십시오. 다음 네 옵션 중 하나를 사용하여 캐시 ID 규칙을 빌드할 수 있습니다.
    • SOAPEnvelope의 해시 계산
    • SOAPHeader 항목 사용
    • operation 및 part 매개변수 사용
    • 입력 SOAP 메시지 컨텐츠에서 캐시 ID를 빌드하기 위해 사용자 정의 Java 코드 사용
    SOAP 헤더의 일부로 캐시 키를 빌드하기 위한 정보를 포함할 수 있는 경우 SOAPHeader 항목을 사용하는 것이 가장 좋은 선택입니다. 이 메소드는 읽기 쉬운 캐시 키를 작성하고 SOAP 본문을 구문 분석하지 않아도 빌드될 수 있습니다. SOAP 메시지를 기초로 특정 캐시 ID를 생성하려면 사용자 정의 Java 코드를 사용하십시오. 헤더 정보를 포함할 수 없으면, 성능에 대해 SOAPEnvelope 해시를 평가하거나 사용자가 익숙한 캐시 키에 대해 SOAP 본문을 구문 분석할 수 있습니다.
  3. 자신의 캐시 정책을 개발하십시오.

    모든 웹 서비스 클라이언트 캐시 정책은 class JAXRPCClient를 가지고 있어야 합니다. 각 캐시 항목의 name 요소는 WSDL 파일에 정의된 대상 엔드포인트 위치입니다. port 요소에 있는 <soap:address location=".."/> 태그를 찾아 WSDL 파일에서 이 주소를 찾을 수 있습니다. 이 샘플에 해당되는 WSDL 파일에서는 주소가 http://TradeSample.com:9080/service/getquote입니다. 다음 옵션 중 하나를 사용하여 캐시 정책의 나머지 부분을 개발하십시오.

    • SOAPEnvelope의 해시를 평가하여 요청 식별
      <cache>
      	<cache-entry>
      				<class>JAXRPCClient</class>
      				<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      						<component id="hash" type="SOAPEnvelope"/>
      			<timeout>60</timeout>
      		</cache-id>
      	</cache-entry>
      </cache>

      SOAPEnvelope의 해시 평가를 기초로 캐시 ID를 작성하려면 component 속성을 기록하십시오. 이 샘플의 캐시 ID는 http://TradeSample.com:9080/service/getquote:Hash=xxxHashSoapEnvelope로 생성됩니다.

    • SoapHeader를 사용하여 요청 식별
      <cache>
      	<cache-entry>
      				<class>JAXRPCClient</class>
      				<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      						<component id="urn:stock:getQuote" type="SOAPHeaderEntry"/>
      		</cache-id>
      	</cache-entry>
      </cache>

      이 캐시 ID는 캐시의 항목에 대한 요청을 식별하기 위해 SOAP 헤더에 있는 특수 정보를 사용하여 빌드됩니다. WSDL 파일에서 binding 요소에 있는 SOAPHeaderEntry으로 type을, operation 이름으로 id를 지정하십시오. 이 샘플의 캐시 ID는 http://TradeSample.com:9080/service/getquote:urn:stock:getQuote=IBM으로 생성됩니다.

      SOAP 헤더를 사용하여 클라이언트가 생성한 SOAP 요청의 예제:

      soapenv:actor 속성에는 com.ibm.websphere.cache가 포함되어야 합니다.
      POST /wsgwsoap1/soaprpcrouther HTTP/1.1
      SOAPAction: ""
      Context-Type: text/xml; charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Content-Length: 645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      		xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header>
      	<getQuote soapenv:actor="com.ibm.websphere.cache" xmlns="urn:stock">IBM</getQuote>
      </soapenv:Header>
      <soapenv:Body
      soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
      	<getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      				<symbol xsi:type="xsd:string">IBM</symbol>
      	</getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
    • operation 및 part를 사용하여 요청 식별
      <cache>
      	<cache-entry>
      				<class>JAXRPCClient</class>
      				<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      						<component id="" type="operation">
      								<value>http://TradeSample.com/:getQuote</value>
      			</component>
      						<component id="symbol" type="part"/>
      		</cache-id>
      	</cache-entry>
      </cache>

      이 예는 operation 및 request 매개변수를 사용합니다. operationbinding 요소에 있는 WSDL 파일의 메소드 이름이나 DII(Document/Literal Invocation)의 메소드 이름이 될 수 있습니다. 조작의 네임스페이스가 정의된 경우, 값은 namespaceOfOperation:nameOfOperation으로 형식화됩니다. part 유형은 WSDL 파일의 message 요소에 request 매개변수나 DII 호출의 request 매개변수로 정의될 수 있습니다. id 속성은 파트 또는 매개변수 이름이며 value는 파트 또는 매개변수 값입니다. operation 또는 request 매개변수 사용으로 생성되는 캐시 ID는 http://TradeSample.com:9080/service/getquote:operation=http://TradeSample.com/:getQuote/symbol=IBM입니다.

      operation 및 part를 사용하여 클라이언트가 생성하는 SOAP 요청의 예제:

      POST /wsgwsoap1/soaprpcrouter HTTP/1.1
      SOAPAction:""
      Content-Type: text/xml/charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Current-Length: 645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns: soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      		xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body
      		soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      		<getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      				<symbol xsi:type="xsd:string">IBM</symbol>
      	</getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
    • 사용자 정의 Java 코드를 사용하여 입력 SOAP 메시지 컨텐츠에서 캐시 ID를 빌드

      캐시 ID를 빌드하기 위해 사용자 정의 Java 코드를 사용할 경우, com.ibm.websphere.cache.webservices.IdGenerator 패키지에 정의되어 있는 IdGenerator 인터페이스를 구현하는 ID 생성자 Java 클래스를 작성하고 idgenerator 태그를 사용하여 cachespec.xml 파일에서 작성하는 클래스에 대한 참조를 추가하십시오.

      metadatagenerator 태그를 사용하는 캐시 항목에 캐시 메타데이터(예: 제한시간, 우선순위 및 종속성 ID)를 지정하기 위해 com.ibm.websphere.cache.webservices.MetaDataGenerator 패키지를 구현할 수도 있습니다.

      캐시 ID를 생성하고 캐시에 있는 항목을 무효화하려면 com.ibm.websphere.cache.webservices.InvalidationGenerator 인터페이스를 구현하고 cachespec.xml 파일에서 invalidationgenerator 태그를 사용하십시오. 무효화 생성자를 통해 생성되는 ID는 캐시 ID 또는 종속성 ID일 수 있습니다.

      예를 들면, SampleIdGeneratorImpl이라고 하는 ID 생성자 클래스 및 SampleInvalidationGeneratorImpl이라고 무효화 생성자 클래스를 개발할 경우, cachespec.xml 파일에는 다음이 포함될 수 있습니다.

      <cache-entry>
      			<class>JAXRPCClient</class>
      			<name>http://TradeSample.com:9080/service/getquote</name>
      	<cache-id>
      				<idgenerator>com.mycompany.SampleIdGeneratorImpl</idgenerator>
      				<metadatagenerator>
             com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
          </metadatagenerator>
      		<timeout>60</timeout>
      	</cache-id>
      		<invalidation>http://TradeSample.com:9080/service/GetQuote
      				<invalidationgenerator>
             com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
          </invalidationgenerator>
      		</invalidation>
      </cache-entry>
      SampleIdGeneratorImpl 클래스는 com.websphere.cache.webservices.IdGenerator 인터페이스를 구현하는 사용자 정의 Java 클래스입니다. SampleIdGeneratorImpl 클래스에는 다음의 getID 메소드가 있습니다.
      String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      다음은 SampleIdGeneratorImpl.java 클래스의 예입니다.

      public class SampleIdGeneratorImpl implements IdGenerator {
      //The SampleIdGenerator class builds cache keys using SOAP header entries
          public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext 
      						messageContext) {
      			....
      						// retrieve SOAP header entries from SOAPMessage
      						SOAPHeader sh = soapEnvelope.getHeader();
      	   		   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   				   		SOAPHeaderElement element =
      			              			              (SOAPHeaderElement)it.next();
      										Name name = element.getElementName();
      										String headerEntryName = name.getLocalName();
      										if (headerEntryName.equals("getQuote")){
      											String sNamespace = element.getNamespaceURI("");
      											if (sNamespace != null && !sNamespace.equals("")) {
      		    						    			headerEntryName = sNamespace + ":" + headerEntryName;
      													String quotes = element.getValue();
      						}
      						...
      						...
      											// create a method "parseAndSort" to parse and sort quotes
      											// By parsing and sorting quotes, you avoid duplicate cache 
      											// entries.
      											// quotes e.g. IBM,CSCO,MSFT,INTC
      											// to return a cache key "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
      											String sortQuotes = parseAndSort(quotes); 
      												cacheKey = headerEntryName + "=" + sortQuotes;
      	   			}
      				}
      				return cacheKey;
      		}
      	}

      이 샘플의 캐시 ID는 http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT로 생성됩니다.

      SampleMetaDataAndInvalidationGeneratorImpl 클래스는 com.websphere.cache.webservices.MetaDataGenerator 인터페이스 및 com.websphere.cache.webservices.InvalidationGenerator 인터페이스를 구현하는 사용자 정의 Java 클래스입니다. SampleMetaDataAndInvalidationGeneratorImpl 클래스에는 setMetaData 메소드 및 getInvalidationIds 메소드가 포함됩니다. 하나의 큰 클래스 대신에 보다 작은 두 개의 클래스로 설정할 수도 있습니다. 예를 들면, 메타데이터 생성자용으로 하나의 클래스를 작성하고 무효화 생성자용으로 또 다른 클래스 하나를 작성하십시오. 다음 클래스는 setMetaData method 및 getInvalidationIds 메소드에 대한 메소드 프로토타입입니다.

      void setMetaData (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, 
      		com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo)
      String[] getInvalidationIds (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      SampleMetaDataAndInvalidationGeneratorImpl.java 클래스의 예는 다음과 같습니다.

      public class SampleMetaDataAndInvalidationGeneratorImpl implements 
        MetaDataGenerator, InvalidationGenerator {
          //assigns time limit, and priority metadata
          public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, 
        com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
      			....
                      
      					// retrieve SOAP header entries from SOAPMessage
      						SOAPHeader sh = soapEnvelope.getHeader();
      	   		   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   				   		SOAPHeaderElement element =
      			              			              (SOAPHeaderElement)it.next();
      										Name name = element.getElementName();
      										String headerEntryName = name.getLocalName();
      	                                	                                if (headerEntryName.equals(“metadata”)) {
      										// retrieve each metadata element and set metadata 
      	                	                entryInfo.setTimeLimit(timeLimit);
                      entryInfo.setPriority(priority);
                  }
              }
          }
      
          //builds invalidation ids using SOAP header. 
          public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext 
            messageContext) {			....
      						// retrieve SOAP header entries from SOAPMessage
                      String[] invalidationIds = new String[1];
      						SOAPHeader sh = soapEnvelope.getHeader();
      	   		   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   				   		SOAPHeaderElement element =
      			              			              (SOAPHeaderElement)it.next();
      										Name name = element.getElementName();
      										String headerEntryName = name.getLocalName();
      	                                	                                if (headerEntryName.equals("invalidation")) {
      										String sNamespace = element.getNamespaceURI("");
      										if (sNamespace != null && !sNamespace.equals("")) {
      		    					    			headerEntryName = sNamespace + ":symbol";
      												String quotes = element.getValue();
      					}
      					...
      					...
      										// create a method "parseAndSort" to parse and sort quotes
      										// By parsing and sorting quotes, you avoid duplicate cache 
      										// entries.
      										// quotes e.g. SUNW,NT
      										// to return a cache key "urn:stock:symbol=NT,SUNW"
      										String sortQuotes = parseAndSort(quotes); 
      										invalidationIds[0] = headerEntryName + "=" sortQuotes;
                   }
      	   	}
      				return invalidationIds;
          }
      }
      
      이 샘플의 무효화 ID는 다음으로 생성됩니다.
      http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW

      사용자 정의 Java 코드를 사용할 때 클라이언트가 생성하는 SOAP 요청의 예제는 다음과 같습니다.

      POST /wsgwsoap1/soaprpcrouter HTTP/1.1
      SOAPAction: ""
      Context-type: text/xml, charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Content-Length:645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      			xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      		xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header>
      		<getQuote soapenv:actor="com.mycompany.actor"
      						xmlns="urn:stock">IBM,CSCO,MSFT,INTC</getQuote>
      				<metaData soapenv:actor="com.mycompany.actor" xmlns="urn:stock">
      			<priority>10</priority>
      						<timeLimit>30000</timeLimit>
      		</metaData>
      				<invalidation soapenv:actor="com.mycompany.actor" 
      						xmlns="urn:stock">SUNW, NT</invalidation>
      </soapenv:Header>
      <soapenv:Body
      soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
      <getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      		<symbol xsi:type="xsd:string">IBM,CSCO,MSFT,INTC</symbol>
      </getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
  4. 적절한 디렉토리에 캐시 정책을 저장하십시오.
    • SOAP 채널 1에서 웹 서비스 게이트웨이를 사용할 경우, 디렉토리는 <app_server_root>\installedApps\wsgwsoap1.servername.nodename.ear/wsgwsoap.war/WEB-INF입니다.
    • 애플리케이션에서 간단한 JAX-RPC 클라이언트를 사용하여 원격 웹 서비스를 호출할 경우, 사용자 JAX-RPC 애플리케이션의 웹 모듈 WEB-INF에 캐시 정책을 저장하십시오.

결과

동적 캐시 모니터를 사용하여 웹 서비스 클라이언트 캐시 정책 결과를 모니터할 수 있습니다. 자세한 정보는 캐시 정보 표시의 내용을 참조하십시오.

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



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