42장. 컨텍스트 작업
초록
Cryostat-WS는 컨텍스트를 사용하여 메시징 체인을 통해 메타데이터를 전달합니다. 이 메타데이터는 해당 범위에 따라 구현 수준 코드에서 액세스할 수 있습니다. 구현 수준 아래의 메시지에서 작동하는 Cryostat-WS 핸들러에도 액세스할 수 있습니다.
42.1. 컨텍스트 이해
42.1.1. 개요
대부분의 경우 메시지에 대한 정보를 애플리케이션의 다른 부분에 전달해야 합니다. Apache CXF는 컨텍스트 메커니즘을 사용하여 이 작업을 수행합니다. 컨텍스트는 발신 또는 들어오는 메시지와 관련된 속성을 보유하는 맵입니다. 컨텍스트에 저장된 속성은 일반적으로 메시지에 대한 메타데이터이며 메시지를 전달하는 데 사용되는 기본 전송입니다. 예를 들어 HTTP 응답 코드 또는 JMS 상관 ID와 같은 메시지를 전송하는 데 사용되는 전송 특정 헤더는 Cryostat-WS 컨텍스트에 저장됩니다.
컨텍스트는 모든 수준의 Cryostat-WS 애플리케이션에서 사용할 수 있습니다. 그러나 메시지 처리 스택에서 컨텍스트에 액세스하는 위치에 따라 미묘한 방식이 다릅니다. Cryostat-WS Handler 구현은 컨텍스트에 직접 액세스할 수 있으며 설정된 모든 속성에 액세스할 수 있습니다. 서비스 구현에서는 컨텍스트를 삽입하여 액세스 권한을 적용하고 APPLICATION
범위에서 설정된 속성에만 액세스할 수 있습니다. 소비자 구현은 APPLICATION
범위에 설정된 속성에만 액세스할 수 있습니다.
그림 42.1. “메시지 컨텍스트 및 메시지 처리 경로” 컨텍스트 속성이 Apache CXF를 통과하는 방법을 보여줍니다. 메시지가 메시징 체인을 통과하면 연결된 메시지 컨텍스트가 함께 전달됩니다.
그림 42.1. 메시지 컨텍스트 및 메시지 처리 경로
42.1.2. 컨텍스트에 속성을 저장하는 방법
메시지 컨텍스트는 javax.xml.ws.handler.MessageContext 인터페이스의 모든 구현입니다. MessageContext 인터페이스는 java.util.Map<String 키, Object value> 인터페이스를 확장합니다. map 오브젝트는 정보를 키 값 쌍으로 저장합니다.
메시지 컨텍스트에서 속성은 이름/값 쌍으로 저장됩니다. 속성의 키는 속성을 식별하는 문자열입니다
. 속성 값은 Java 개체에 저장된 모든 값일 수 있습니다. 메시지 컨텍스트에서 값이 반환되면 애플리케이션은 예상 유형을 알고 적절하게 캐스팅해야 합니다. 예를 들어 속성의 값이 UserInfo 개체에 저장된 경우 메시지 컨텍스트에서 여전히 UserInfo
개체로 캐스팅해야 하는 Object 개체로 반환됩니다.For example, if a property's value is stored in a UserInfo object it is still returned from a message context as an Object
object that must be cast back into a UserInfo
object.
메시지 컨텍스트의 속성에도 범위가 있습니다. 범위는 메시지 처리 체인에서 속성에 액세스할 수 있는 위치를 결정합니다.
42.1.3. 속성 범위
메시지 컨텍스트의 속성은 범위가 지정됩니다. 속성은 다음 범위 중 하나에 있을 수 있습니다.
애플리케이션
-
APPLICATION
으로 범위가 지정된 속성은 Cryostat-WS Handler 구현, 소비자 구현 코드 및 서비스 공급자 구현 코드에서 사용할 수 있습니다. 처리기가 서비스 공급자 구현에 속성을 전달해야 하는 경우 속성의 범위를APPLICATION
으로 설정합니다. 소비자 구현 또는 서비스 공급자 구현 컨텍스트에서 설정된 모든 속성은 자동으로APPLICATION
으로 범위가 지정됩니다. 처리기
-
HANDLER
로 범위가 지정된 속성은 Cryostat-WS Handler 구현에서만 사용할 수 있습니다. Handler 구현에서 메시지 컨텍스트에 저장된 속성은 기본적으로HANDLER
로 범위가 지정됩니다.
메시지 컨텍스트의 setScope()
메서드를 사용하여 속성 범위를 변경할 수 있습니다. 예 42.1. “MessageContext.setScope()
메서드” 메서드의 서명을 표시합니다.
예 42.1. MessageContext.setScope()
메서드
SetScope
String
키
MessageContext.Scope
범위
java.lang.IllegalArgumentException
첫 번째 매개 변수는 속성의 키를 지정합니다. 두 번째 매개 변수는 속성의 새 범위를 지정합니다. 범위는 다음 중 하나일 수 있습니다.
-
MessageContext.Scope.APPLICATION
-
MessageContext.Scope.HANDLER
42.1.4. 처리기의 컨텍스트 개요
Cryostat-WS Handler 인터페이스를 구현하는 클래스는 메시지의 컨텍스트 정보에 직접 액세스할 수 있습니다. 메시지의 컨텍스트 정보는 Handler 구현의 handleMessage()
, handleFault()
및 close()
메서드에 전달됩니다.
처리기 구현은 범위에 관계없이 메시지 컨텍스트에 저장된 모든 속성에 액세스할 수 있습니다. 또한 논리 처리기는 LogicalMessageContext
라는 특수 메시지 컨텍스트를 사용합니다. LogicalMessageContext
오브젝트에는 메시지 본문의 콘텐츠에 액세스하는 메서드가 있습니다.
42.1.5. 서비스 구현의 컨텍스트 개요
서비스 구현은 메시지 컨텍스트에서 APPLICATION
으로 범위가 지정된 속성에 액세스할 수 있습니다. 서비스 공급자의 구현 오브젝트는 WebServiceContext 오브젝트를 통해 메시지 컨텍스트에 액세스합니다.
자세한 내용은 42.2절. “서비스 구현에서 컨텍스트 작업” 에서 참조하십시오.
42.1.6. 소비자 구현의 컨텍스트 개요
소비자 구현은 메시지 컨텍스트의 콘텐츠에 대한 간접 액세스 권한을 갖습니다. 소비자 구현에는 두 가지 별도의 메시지 컨텍스트가 있습니다.
- 요청 컨텍스트 - 발신 요청에 사용되는 속성의 사본을 보유하고 있습니다.
- 응답 컨텍스트 - 들어오는 응답에서 속성의 사본을 보유하고 있습니다.
디스패치 계층은 소비자 구현의 메시지 컨텍스트와 Handler 구현에서 사용하는 메시지 컨텍스트 간에 속성을 전송합니다.
요청이 소비자 구현에서 디스패치 계층에 전달되면 요청 컨텍스트의 콘텐츠가 디스패치 계층에서 사용되는 메시지 컨텍스트로 복사됩니다. 서비스에서 응답이 반환되면 디스패치 계층에서 메시지를 처리하고 적절한 속성을 메시지 컨텍스트로 설정합니다. 디스패치 계층에서 응답을 처리하면 메시지 컨텍스트에서 APPLICATION
범위 모든 속성을 소비자 구현의 응답 컨텍스트에 복사합니다.
자세한 내용은 42.3절. “소비자 구현에서 컨텍스트 작업” 에서 참조하십시오.