41장. 원시 XML 메시지 사용
초록
고급 Cryostat-WS API는 데이터를 CryostatB 객체로 마샬링하여 개발자가 네이티브 XML 메시지를 사용하지 못하도록 보호합니다. 그러나 전선에 전달되는 원시 XML 메시지 데이터에 직접 액세스하는 것이 더 나은 경우가 있습니다. Cryostat-WS API는 원시 XML에 대한 액세스를 제공하는 두 개의 인터페이스를 제공합니다. Dispatch 인터페이스는 클라이언트 측 인터페이스이고 공급자 인터페이스는 서버 측 인터페이스입니다.
41.1. 소비자에서 XML 사용
초록
Dispatch 인터페이스는 원시 메시지와 직접 작업할 수 있는 낮은 수준의 Cryostat-WS API입니다. 192.0.2. 개체, Cryostat 메시지 및 CryostatB 오브젝트를 포함한 다양한 유형의 메시지 또는 페이로드를 수락하고 반환합니다. 하위 수준 API이므로 Dispatch 인터페이스는 상위 수준의 Cryostat-WS API가 수행하는 메시지 준비 작업을 수행하지 않습니다. 메시지 또는 페이로드가 Dispatch 개체로 전달되는 것이 적절하고 호출되는 원격 작업에 적합한지 확인해야 합니다.
41.1.1. 사용 모드
41.1.1.1. 개요
디스패치 오브젝트에는 두 가지 사용 모드가 있습니다.
Dispatch 오브젝트에 지정하는 사용 모드는 사용자 수준 코드로 전달되는 세부 정보의 양을 결정합니다.
41.1.1.2. 메시지 모드
메시지 모드에서 Dispatch 오브젝트는 완전한 메시지와 함께 작동합니다. 전체 메시지에는 바인딩 특정 헤더 및 래퍼가 포함됩니다. 예를 들어 Cryostat 메시지가 필요한 서비스와 상호 작용하는 소비자는 Dispatch 개체의 invoke()
메서드를 완전히 지정된 Cryostat 메시지를 제공해야 합니다. invoke()
메서드도 완전히 지정된 Cryostat 메시지를 반환합니다. 소비자 코드는 Cryostat 메시지의 헤더와 message's message's information을 작성하고 읽습니다.
CryostatB 오브젝트로 작업할 때는 메시지 모드가 적합하지 않습니다.
Dispatch 개체가 메시지 모드를 사용하도록 지정하려면 Dispatch 오브젝트를 생성할 때 java.xml.ws.Service.Mode.MESSAGE 값을 제공합니다. Dispatch 오브젝트 생성에 대한 자세한 내용은 “Dispatch 오브젝트 생성” 에서 참조하십시오.
41.1.1.3. 페이로드 모드
페이로드 모드에서 는 메시지 페이로드 모드라고도 하며 Dispatch 오브젝트는 메시지의 페이로드에서만 작동합니다. 예를 들어 페이로드 모드에서 작동하는 Dispatch 오브젝트는 Cryostat 메시지의 본문에서만 작동합니다. 바인딩 계층은 바인딩 수준 래퍼 및 헤더를 처리합니다. 결과가 invoke()
메서드에서 반환되면 바인딩 수준 래퍼 및 헤더가 이미 제거되고 메시지의 본문만 남습니다.
Apache CXF XML 바인딩, 페이로드 모드 및 메시지 모드와 같이 특수 래퍼를 사용하지 않는 바인딩으로 작업하는 경우 동일한 결과를 제공합니다.
Dispatch 개체가 페이로드 모드를 사용하도록 지정하려면 Dispatch 오브젝트를 생성할 때 java.xml.ws.Service.Mode.PAYLOAD 값을 제공합니다. Dispatch 오브젝트 생성에 대한 자세한 내용은 “Dispatch 오브젝트 생성” 에서 참조하십시오.
41.1.2. 데이터 유형
41.1.2.1. 개요
Dispatch 오브젝트는 하위 수준 오브젝트이므로 상위 소비자 API와 동일한 CryostatB 생성 유형을 사용하기에 최적화되지 않습니다. 디스패치 오브젝트는 다음 유형의 오브젝트에서 작동합니다.
41.1.2.2. 소스 오브젝트 사용
Dispatch 오브젝트는 javax.xml.transform.Source 인터페이스에서 파생된 오브젝트를 수락하고 반환합니다. 소스 오브젝트는 모든 바인딩과 메시지 모드 또는 페이로드 모드에서 지원됩니다.
소스 오브젝트는 XML 문서를 보유하는 하위 수준 오브젝트입니다. 각 소스 구현은 저장된 XML 문서에 액세스한 다음 해당 내용을 조작하는 메서드를 제공합니다. 다음 오브젝트는 소스 인터페이스를 구현합니다.
CryostatSource
-
XML 메시지를 Document Object Model(DOM) 트리로 보관합니다. XML 메시지는
get
메서드를 사용하여 액세스하는 노드 오브젝트 세트로 저장됩니다. 노드는Node
()setNode()
메서드를 사용하여 Cryostat 트리에 업데이트하거나 추가할 수 있습니다. SAXSource
-
XML 메시지를 SX(Simple API for XML) 개체로 보관합니다. SAX 개체에는 원시 데이터 및 원시 데이터를 구문 분석하는
XML
Cryostat 개체를 보유하는InputSource
오브젝트가 포함되어 있습니다. StreamSource
- XML 메시지를 데이터 스트림으로 보관합니다. 데이터 스트림은 다른 데이터 스트림과 동일하게 조작될 수 있습니다.
Dispatch 개체를 생성하여 일반 Source 오브젝트를 사용하도록 하는 경우 Apache CXF는 메시지를 SAXSource
개체로 반환합니다.
이 동작은 끝점의 source-preferred-format
속성을 사용하여 변경할 수 있습니다. Apache CXF 런타임 구성에 대한 자세한 내용은 IV 부. 웹 서비스 엔드 포인트 구성 을 참조하십시오.
41.1.2.3. CryostatMessage 오브젝트 사용
다음 조건이 true인 경우 디스패치 오브젝트는 javax.xml.soap.SOAPMessage
오브젝트를 사용할 수 있습니다.
- Dispatch 개체가 Cryostat 바인딩을 사용하고 있습니다.
- Dispatch 오브젝트에서 메시지 모드를 사용 중
Cryo statMessage
오브젝트에는 Cryostat 메시지가 있습니다. 이 개체에는 하나의 CryostatPart
개체와 0개 이상의 AttachmentPart
개체가 포함되어 있습니다. Cryo statPart
개체에는 Cryostat, any Cryostat 헤더 및 Cryostat 메시지 본문을 포함하여 Cryostat 메시지의 Cryostat 특정 부분이 포함되어 있습니다. AttachmentPart
오브젝트에는 첨부 파일로 전달되는 바이너리 데이터가 포함되어 있습니다.
41.1.2.4. DataSource 개체 사용
디스패치 개체는 다음 조건이 true인 경우 javax.activation.DataSource 인터페이스를 구현하는 개체를 사용할 수 있습니다.
- Dispatch 오브젝트에서 HTTP 바인딩을 사용하고 있습니다.
- Dispatch 오브젝트에서 메시지 모드를 사용 중
데이터 소스 오브젝트는 URL, 파일, 바이트 배열을 포함하여 다양한 소스에서 MIME 형식 데이터를 사용하기 위한 메커니즘을 제공합니다.
41.1.2.5. CryostatB 오브젝트 사용
Dispatch 오브젝트는 원시 메시지로 작업할 수 있는 낮은 수준 API로 의도된 반면, 이를 통해 CryostatB 오브젝트를 사용할 수도 있습니다. CryostatB 개체를 사용하려면 Dispatch 오브젝트를 전달해야 합니다. 이 오브젝트는 마샬링 및 사용 중인 개체를 위임 해제할 수 있습니다. Cryo
statBContext
는 Dispatch
오브젝트가 생성될 때 전달됩니다.
CryostatB Context 오브젝트에서 이해하는 모든 CryostatB
오브젝트를 invoke()
메서드에 매개 변수로 전달할 수 있습니다. 반환된 메시지를 Cryostat BContext
개체에서 인식하는 모든 object로 캐스팅할 수도 있습니다.
Cryostat BContext 오브젝트 생성에 대한
자세한 내용은 39장. A Cryo statBContext
오브젝트 사용 을 참조하십시오.
41.1.3. Dispatch Objects 작업
41.1.3.1. 프로세스
Dispatch 오브젝트를 사용하여 원격 서비스를 호출하려면 다음 시퀀스를 따라야 합니다.
41.1.3.2. Dispatch 오브젝트 생성
Dispatch 오브젝트를 생성하려면 다음을 수행합니다.
-
Dispatch 개체가 호출할 서비스를 정의하는
wsdl:service
요소를 나타내는Service
오브젝트를 생성합니다. 25.2절. “서비스 오브젝트 생성”을 참조하십시오. 예 41.1. “
createDispatch()
메서드” 에 표시된Service
오브젝트의createDispatch()
메서드를 사용하여 Dispatch 오브젝트를 생성합니다.예 41.1.
createDispatch()
메서드public
Dispatch<T
>createDispatch
QName
portName
java.lang.Class<T
>type
Service.Mode
mode
WebServiceException참고CryostatB 개체를 사용하는 경우
createDispatch()
에 대한 메서드 서명은 publicDispatch<T
>createDispatch
QName
portName
javax.xml.bind.JAXBContext
context
Service.Mode
mode
WebServiceException표 41.1. “
createDispatch()
매개변수”createDispatch()
메서드의 매개변수를 설명합니다.표 41.1. createDispatch()매개변수 매개변수 설명 portName
Dispatch 개체가 호출할 서비스 공급자를 나타내는
wsdl:port
요소의 QName을 지정합니다.type
Dispatch 개체에서 사용하는 오브젝트의 데이터 형식을 지정합니다. 41.1.2절. “데이터 유형”을 참조하십시오. CryostatB 오브젝트로 작업할 때 이 매개변수는 개체를 마샬링하고 unmarshal하는 데 사용되는 Cryostat
BContext
오브젝트를 지정합니다.mode
Dispatch 오브젝트의 사용 모드를 지정합니다. 41.1.1절. “사용 모드”을 참조하십시오.
예 41.2. “Dispatch 오브젝트 생성” 페이로드 모드에서 192.0.2. Source
개체와 함께 작동하는 Dispatch 개체를 만드는 코드를 보여줍니다.
예 41.2. Dispatch 오브젝트 생성
package com.fusesource.demo; import javax.xml.namespace.QName; import javax.xml.ws.Service; public class Client { public static void main(String args[]) { QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter"); Service s = Service.create(serviceName); QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort"); Dispatch<DOMSource> dispatch = s.createDispatch(portName, DOMSource.class, Service.Mode.PAYLOAD); ...
41.1.3.3. 요청 메시지 구성
Dispatch 오브젝트로 작업할 때 요청을 처음부터 빌드해야 합니다. 개발자는 Dispatch 오브젝트에 전달된 메시지가 대상 서비스 공급자가 처리할 수 있는 요청과 일치하는지 확인해야 합니다. 이를 위해서는 서비스 공급자가 사용하는 메시지와 필요한 헤더 정보가 무엇인지에 대한 정확한 지식이 필요합니다.
이 정보는 WSDL 문서 또는 메시지를 정의하는 XML 스키마 문서에서 제공할 수 있습니다. 서비스 공급자는 크게 다르지만 몇 가지 지침을 따라야합니다.
요청의 root 요소는 호출되는 작업에 해당하는
wsdl:operation
요소의name
특성 값을 기반으로 합니다.주의호출 중인 서비스에서 doc/literal 베어 메시지를 사용하는 경우 요청의 root 요소는
wsdl:operation
요소가 참조하는wsdl:part
요소의name
속성 값을 기반으로 합니다.- 요청의 root 요소는 namespace qualified 입니다.
호출 중인 서비스에서 rpc/literal 메시지를 사용하는 경우 요청의 최상위 요소는 네임스페이스가 정규화되지 않습니다.
중요최상위 요소의 하위 항목은 네임스페이스가 한정될 수 있습니다. 이를 위해서는 해당 스키마 정의를 확인해야 합니다.
- 호출 중인 서비스에서 rpc/literal 메시지를 사용하는 경우 최상위 요소 중 어느 것도 null일 수 없습니다.
- 호출 중인 서비스에서 doc/literal 메시지를 사용하는 경우 메시지의 스키마 정의에서 네임스페이스가 유효한지 여부를 결정합니다.
서비스에서 XML 메시지를 사용하는 방법에 대한 자세한 내용은 WS-I Basic Profile 을 참조하십시오.
41.1.3.4. 동기 호출
응답을 생성하는 동기 호출을 수행하는 소비자의 경우 예 41.3. “Dispatch.invoke()
메서드” 에 표시된 Dispatch 오브젝트의 invoke()
메서드를 사용합니다.
예 41.3. Dispatch.invoke()
메서드
T
invoke
T
msg
WebServiceException
Dispatch 개체가 생성될 때 invoke()
메서드에 전달된 응답 및 요청의 유형이 결정됩니다. 예를 들어 createDispatch(portName, CryostatMessage.class, Service.Mode.MESSAGE)
를 사용하여 Dispatch 오브젝트를 생성하는 경우 응답과 요청은 모두 Cryostat Message
오브젝트입니다.
CryostatB 개체를 사용하는 경우 응답과 요청은 제공된 모든 유형 중 하나일 수 있으며, 제공된 Cryostat BContext
개체는 마샬링 및 unmarshal을 마샬링할 수 있습니다. 또한 응답과 요청은 다른 CryostatB 오브젝트일 수 있습니다.
예 41.4. “Dispatch 오브젝트를 사용하여 Synchronous Invocation 만들기” 192.0.2. Source
개체를 사용하여 원격 서비스에 대해 동기적으로 호출하기 위한 코드를 표시합니다.
예 41.4. Dispatch 오브젝트를 사용하여 Synchronous Invocation 만들기
// Creating a DOMSource Object for the request DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder(); Document requestDoc = db.newDocument(); Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice"); root.setNodeValue("DOW"); DOMSource request = new DOMSource(requestDoc); // Dispatch disp created previously DOMSource response = disp.invoke(request);
41.1.3.5. 비동기 호출
디스패치 개체는 비동기 호출도 지원합니다. 40장. 비동기 애플리케이션 개발 에서 논의된 상위 수준의 비동기 API와 마찬가지로 Dispatch 오브젝트는 폴링 접근 방식과 콜백 접근 방식을 모두 사용할 수 있습니다.
폴링 방식을 사용할 때 invokeAsync()
메서드는 응답이 도착했는지 확인하기 위해 폴링할 수 있는 Response<t
> 오브젝트를 반환합니다. 예 41.5. “Dispatch.invokeAsync()
Polling 방법” 폴링 방식을 사용하여 비동기 호출을 수행하는 데 사용되는 메서드의 서명을 표시합니다.
예 41.5. Dispatch.invokeAsync()
Polling 방법
Response <T>
invokeAsync
T
msg
WebServiceException
비동기 호출에 폴링 접근 방식을 사용하는 방법에 대한 자세한 내용은 40.4절. “Polling Approach를 사용하여 비동기 클라이언트 구현” 을 참조하십시오.
콜백 접근 방식을 사용할 때 invokeAsync()
메서드는 응답을 반환할 때 응답을 처리하는 AsyncHandler 구현을 사용합니다. 예 41.6. “콜백을 사용한 Dispatch.invokeAsync()
메서드” 콜백 접근 방식을 사용하여 비동기 호출을 수행하는 데 사용되는 메서드의 서명을 표시합니다.
예 41.6. 콜백을 사용한 Dispatch.invokeAsync()
메서드
future<?>
;invokeAsync
T
msg
AsyncHandler<T
>처리기
WebServiceException
비동기 호출에 콜백 접근 방식을 사용하는 방법에 대한 자세한 내용은 40.5절. “콜백 접근 방식을 사용하여 비동기 클라이언트 구현” 을 참조하십시오.
동기 invoke()
메서드와 마찬가지로 응답 유형과 요청 유형이 Dispatch 개체를 생성할 때 결정됩니다.
41.1.3.6. OneWay 호출
요청이 응답을 생성하지 않으면 Dispatch 오브젝트의 invokeOneWay()
를 사용하여 원격 호출을 수행합니다. 예 41.7. “Dispatch.invokeOneWay()
방법” 이 메서드의 서명을 표시합니다.
예 41.7. Dispatch.invokeOneWay()
방법
invokeOneWay
T
msg
WebServiceException
요청을 패키징하는 데 사용되는 오브젝트 유형은 Dispatch 오브젝트가 생성될 때 결정됩니다. 예를 들어 Dispatch 개체가 createDispatch(portName, CryostatSource.class, Service.Mode.PAYLOAD)
를 사용하여 생성된 경우 요청은GROUP Source
개체로 패키징됩니다.
CryostatB 개체를 사용하는 경우 응답과 요청은 제공된 Cryostat BContext
개체가 마샬링 및 unmarshal을 마샬링할 수 있는 모든 유형일 수 있습니다.
예 41.8. “Dispatch 오브젝트를 사용하여 One way Invocation 만들기” shows code for making a oneway invocation on a remote service using a CryostatB 오브젝트를 사용하여 원격 서비스에서 단방향 호출을 수행하는 코드를 표시합니다.
예 41.8. Dispatch 오브젝트를 사용하여 One way Invocation 만들기
// Creating a JAXBContext and an Unmarshaller for the request JAXBContext jbc = JAXBContext.newInstance("org.apache.cxf.StockExample"); Unmarshaller u = jbc.createUnmarshaller(); // Read the request from disk File rf = new File("request.xml"); GetStockPrice request = (GetStockPrice)u.unmarshal(rf); // Dispatch disp created previously disp.invokeOneWay(request);