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 헤더의 표준 속성을 나열합니다.
표 42.3. 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 헤더의 속성을 나열합니다.
표 42.4. 설정 가능한 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초로 설정합니다.