42.4. JMS 메시지 속성 작업
초록
Apache CXF JMS 전송에는 JMS 메시지의 속성을 검사하는 데 사용할 수 있는 컨텍스트 메커니즘이 있습니다. 컨텍스트 메커니즘을 사용하여 JMS 메시지의 속성을 설정할 수도 있습니다.
42.4.1. JMS 메시지 헤더 검사
초록
소비자 및 서비스는 다양한 컨텍스트 메커니즘을 사용하여 JMS 메시지 헤더 속성에 액세스합니다. 그러나 두 메커니즘 모두 헤더 속성을 org.apache.cxf.transports.jms.context.JMSMessageHeadersType
오브젝트로 반환합니다.
42.4.1.1. 서비스에서 JMS 메시지 헤더 가져오기
WebServiceContext
개체에서 JMS 메시지 헤더 속성을 가져오려면 다음을 수행합니다.
- “컨텍스트 가져오기” 에 설명된 대로 컨텍스트를 가져옵니다.
-
org.apache.cxf.transports.jms.JMSConstants.JMS_SERVER_HEADERS와 함께 메시지 컨텍스트의
get()
메서드를 사용하여 메시지 헤더를 가져옵니다.
예 42.12. “서비스 구현에서 JMS 메시지 헤더 가져오기” 서비스의 메시지 컨텍스트에서 JMS 메시지 헤더를 가져오는 코드를 표시합니다.
예 42.12. 서비스 구현에서 JMS 메시지 헤더 가져오기
import org.apache.cxf.transport.jms.JMSConstants; import org.apache.cxf.transports.jms.context.JMSMessageHeadersType; @WebService(serviceName = "HelloWorldService", portName = "HelloWorldPort", endpointInterface = "org.apache.cxf.hello_world_jms.HelloWorldPortType", targetNamespace = "http://cxf.apache.org/hello_world_jms") public class GreeterImplTwoWayJMS implements HelloWorldPortType { @Resource protected WebServiceContext wsContext; ... @WebMethod public String greetMe(String me) { MessageContext mc = wsContext.getMessageContext(); JMSMessageHeadersType headers = (JMSMessageHeadersType) mc.get(JMSConstants.JMS_SERVER_HEADERS); ... } ... }
42.4.1.2. 소비자에서 JMS 메시지 헤더 속성 가져오기
JMS 전송에서 메시지가 성공적으로 검색되면 소비자의 응답 컨텍스트를 사용하여 JMS 헤더 속성을 검사할 수 있습니다. 또한 “클라이언트 수신 시간 초과” 에 설명된 대로 클라이언트가 시간 초과 전에 응답을 기다리는 시간을 설정하거나 확인할 수 있습니다. 소비자의 응답 컨텍스트에서 JMS 메시지 헤더를 가져오려면 다음을 수행합니다.
- “컨텍스트 가져오기” 에 설명된 대로 응답 컨텍스트를 가져옵니다.
-
org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RESPONSE_HEADERS와 함께 컨텍스트의
get()
메서드를 사용하여 응답 컨텍스트에서 JMS 메시지 헤더 속성을 가져옵니다.
예 42.13. “소비자 응답 헤더에서 JMS 헤더 가져오기” 소비자의 응답 컨텍스트에서 JMS 메시지 헤더 속성을 가져오는 코드를 표시합니다.
예 42.13. 소비자 응답 헤더에서 JMS 헤더 가져오기
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously BindingProvider bp = (BindingProvider)greeter; Map<String, Object> responseContext = bp.getResponseContext(); JMSMessageHeadersType responseHdr = (JMSMessageHeadersType) responseContext.get(JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); ... }
예 42.13. “소비자 응답 헤더에서 JMS 헤더 가져오기” 의 코드는 다음을 수행합니다.
프록시를 BindingProvider로 캐스팅합니다.
응답 컨텍스트를 가져옵니다.
응답 컨텍스트에서 JMS 메시지 헤더를 검색합니다.
42.4.2. 메시지 헤더 속성 검사
42.4.2.1. 표준 JMS 헤더 속성
표 42.3. “JMS 헤더 속성” 검사할 수 있는 JMS 헤더의 표준 속성을 나열합니다.
속성 이름 | 속성 유형 | getter Method |
---|---|---|
상관 관계 ID |
|
|
전달 모드 |
|
|
메시지 만료 |
|
|
메시지 ID |
|
|
우선 순위 |
|
|
재전송됨 |
|
|
Time Stamp |
|
|
유형 |
|
|
실시간 시간 |
|
|
42.4.2.2. 선택적 헤더 속성
또한 JMSMessageHeadersType.getProperty()
를 사용하여 JMS 헤더에 저장된 선택적 속성을 검사할 수 있습니다. 선택적 속성은 org.apache.cxf.transports.jms.context.JMSPropertyType
목록으로
반환됩니다. 선택적 속성은 이름/값 쌍으로 저장됩니다.
42.4.2.3. 예
예 42.14. “JMS 헤더 속성 읽기” 응답 컨텍스트를 사용하여 일부 JMS 속성을 검사하는 코드를 보여줍니다.
예 42.14. JMS 헤더 속성 읽기
// JMSMessageHeadersType messageHdr retrieved previously System.out.println("Correlation ID: "+messageHdr.getJMSCorrelationID()); System.out.println("Message Priority: "+messageHdr.getJMSPriority()); System.out.println("Redelivered: "+messageHdr.getRedelivered()); JMSPropertyType prop = null; List<JMSPropertyType> optProps = messageHdr.getProperty(); Iterator<JMSPropertyType> iter = optProps.iterator(); while (iter.hasNext()) { prop = iter.next(); System.out.println("Property name: "+prop.getName()); System.out.println("Property value: "+prop.getValue()); }
예 42.14. “JMS 헤더 속성 읽기” 의 코드는 다음을 수행합니다.
메시지의 상관관계 ID 값을 출력합니다.
메시지의 priority 속성 값을 출력합니다.
메시지 재전송된 속성 값을 출력합니다.
메시지의 선택적 헤더 속성 목록을 가져옵니다.
속성 목록을 통과하는 Iterator
를 가져옵니다.
선택적 속성 목록을 반복하고 이름과 값을 출력합니다.
42.4.3. JMS 속성 설정
초록
소비자 끝점의 요청 컨텍스트를 사용하여 여러 JMS 메시지 헤더 속성 및 소비자 끝점의 시간 초과 값을 설정할 수 있습니다. 이러한 속성은 단일 호출에 유효합니다. 서비스 프록시에서 작업을 호출할 때마다 재설정해야 합니다.
서비스에서 헤더 속성을 설정할 수 없습니다.
42.4.3.1. JMS 헤더 속성
표 42.4. “설정 가능한 JMS 헤더 속성” 소비자 엔드포인트의 요청 컨텍스트를 사용하여 설정할 수 있는 JMS 헤더의 속성을 나열합니다.
속성 이름 | 속성 유형 | Setter 방법 |
---|---|---|
상관 관계 ID |
|
|
전달 모드 |
|
|
우선 순위 |
|
|
실시간 시간 |
|
|
-
org.apache.cxf.transports.jms.context.JMSMessageHeadersType
오브젝트를 생성합니다. - 표 42.4. “설정 가능한 JMS 헤더 속성” 에 설명된 적절한 setter 방법을 사용하여 설정할 값을 채웁니다.
-
org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_REQUEST_HEADERS를 첫 번째 인수로 사용하고 새
JMSMessageHeadersType
오브젝트를 두 번째 인수로 사용하여 요청 컨텍스트의put()
메서드를 호출하여 값을 요청 컨텍스트로 설정합니다.
42.4.3.2. 선택적 JMS 헤더 속성
선택적 속성을 JMS 헤더에 설정할 수도 있습니다. 선택적 JMS 헤더 속성은 다른 JMS 헤더 속성을 설정하는 데 사용되는 JMSMessageHeadersType
오브젝트에 저장됩니다. org.apache.cxf.transports.jms.context.JMSPropertyType
개체를 포함하는 List
오브젝트로 저장됩니다. JMS 헤더에 선택적 속성을 추가하려면 다음을 수행합니다.
-
JMSPropertyType
오브젝트를 생성합니다. -
setName()
을 사용하여 속성의 name 필드를 설정합니다. -
setValue()
를 사용하여 속성의 value 필드를 설정합니다. -
JMSMessageHeadersType.getProperty().add(JMSPropertyType)
를 사용하여 JMS 메시지 헤더에 속성을 추가합니다. - 모든 속성이 메시지 헤더에 추가될 때까지 절차를 반복합니다.
42.4.3.3. 클라이언트 수신 시간 초과
JMS 헤더 속성 외에도 소비자 엔드포인트가 시간 초과되기 전에 응답을 기다리는 시간을 설정할 수 있습니다. org.apache.cxf.transports.jms.JMS_CLIENT_RECEIVE_TIMEOUT을 사용하여 요청 컨텍스트의 put()
메서드를 호출하고 첫 번째 인수로 소비자가 두 번째 인수로 대기하려는 시간(밀리초)을 나타내는 긴
시간을 설정합니다.
42.4.3.4. 예
예 42.15. “요청 컨텍스트를 사용하여 JMS 속성 설정” 요청 컨텍스트를 사용하여 일부 JMS 속성을 설정하는 코드를 보여줍니다.
예 42.15. 요청 컨텍스트를 사용하여 JMS 속성 설정
import org.apache.cxf.transports.jms.context.*; // Proxy greeter initialized previously InvocationHandler handler = Proxy.getInvocationHandler(greeter); BindingProvider bp= null; if (handler instanceof BindingProvider) { bp = (BindingProvider)handler; Map<String, Object> requestContext = bp.getRequestContext(); JMSMessageHeadersType requestHdr = new JMSMessageHeadersType(); requestHdr.setJMSCorrelationID("WithBob"); requestHdr.setJMSExpiration(3600000L); JMSPropertyType prop = new JMSPropertyType; prop.setName("MyProperty"); prop.setValue("Bluebird"); requestHdr.getProperty().add(prop); requestContext.put(JMSConstants.CLIENT_REQUEST_HEADERS, requestHdr); requestContext.put(JMSConstants.CLIENT_RECEIVE_TIMEOUT, new Long(1000)); }
예 42.15. “요청 컨텍스트를 사용하여 JMS 속성 설정” 의 코드는 다음을 수행합니다.
변경하려는 JMS 속성이 있는 프록시에 대한 InvocationHandler
를 가져옵니다.
InvocationHandler
가 BindingProvider
인지 확인합니다.
반환된 InvocationHandler
오브젝트를 BindingProvider
오브젝트로 캐스팅하여 요청 컨텍스트를 검색합니다.
요청 컨텍스트를 가져옵니다.
새 메시지 헤더 값을 유지하기 위해 JMSMessageHeadersType
오브젝트를 생성합니다.
Correlation ID를 설정합니다.
Expiration 속성을 60분으로 설정합니다.
새 JMSPropertyType
오브젝트를 생성합니다.
선택적 속성의 값을 설정합니다.
메시지 헤더에 선택적 속성을 추가합니다.
JMS 메시지 헤더 값을 요청 컨텍스트로 설정합니다.
클라이언트 수신 시간 초과 속성을 1초로 설정합니다.