42.4. JMS Message Properties 사용

초록

Apache CXF JMS 전송에는 JMS 메시지의 속성을 검사하는 데 사용할 수 있는 컨텍스트 메커니즘이 있습니다. 컨텍스트 메커니즘을 사용하여 JMS 메시지의 속성을 설정할 수도 있습니다.

42.4.1. JMS 메시지 헤더 검사

초록

소비자 및 서비스는 JMS 메시지 헤더 속성에 액세스하기 위해 다양한 컨텍스트 메커니즘을 사용합니다. 그러나 두 메커니즘 모두 헤더 속성을 org.apache.cxf.transports.jms.context.JMSMessageHeadersType 오브젝트로 반환합니다.

42.4.1.1. 서비스에서 JMS 메시지 헤더 가져오기

WebServiceContext 개체에서 JMS 메시지 헤더 속성을 가져오려면 다음을 수행합니다.

  1. “컨텍스트 가져오기” 에 설명된 대로 컨텍스트를 가져옵니다.
  2. 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 헤더 속성을 검사할 수 있습니다. 또한 “client Receive Timeout” 에 설명된 대로 시간이 초과되기 전에 클라이언트가 대기하는 시간을 설정하거나 확인할 수 있습니다. 소비자의 응답 컨텍스트에서 JMS 메시지 헤더를 가져오려면 다음을 수행합니다.

  1. “컨텍스트 가져오기” 에 설명된 대로 응답 컨텍스트를 가져옵니다.
  2. org.apache.cxf.transports.jms.JMSConstants.JMS_CLIENT_RESPONSE_HEADERS를 매개 변수로 사용하여 응답 컨텍스트에서 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 상관 관계

string

getJMSCorralationID()

전송 모드

int

getJMSDeliveryMode()

메시지 만료

long

getJMSExpiration()

메시지 ID

string

getJMSMessageID()

우선 순위

int

getJMSPriority()

redelivered

boolean

getJMSRedlivered()

Time Stamp

long

getJMSTimeStamp()

유형

string

getJMSType()

라이브 시간

long

getTimeToLive()

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 값을 출력합니다.

메시지의 우선순위 속성 값을 출력합니다.

메시지의 재전송 속성 값을 출력합니다.

메시지의 선택적 헤더 속성 목록을 가져옵니다.Gets the list of the message's optional header properties.

속성 목록을 통과할 Iterator 를 가져옵니다.

선택적 속성 목록을 반복하고 이름과 값을 출력합니다.

42.4.3. JMS 속성 설정

초록

소비자 끝점에서 요청 컨텍스트를 사용하여 여러 JMS 메시지 헤더 속성 및 소비자 끝점의 제한 값을 설정할 수 있습니다. 이러한 속성은 단일 호출에 유효합니다. 서비스 프록시에서 작업을 호출할 때마다 다시 설정해야 합니다.

서비스에 헤더 속성을 설정할 수 없습니다.

42.4.3.1. JMS 헤더 속성

표 42.4. “settable JMS Header Properties” 소비자 엔드포인트의 요청 컨텍스트를 사용하여 설정할 수 있는 JMS 헤더의 속성을 나열합니다.

표 42.4. settable JMS Header Properties

속성 이름속성 유형setter Method

ID 상관 관계

string

setJMSCorralationID()

전송 모드

int

setJMSDeliveryMode()

우선 순위

int

setJMSPriority()

라이브 시간

long

setTimeToLive()

이러한 속성을 설정하려면 다음을 수행합니다.

  1. org.apache.cxf.transports.jms.context.JMSMessageHeadersType 오브젝트를 생성합니다.
  2. 표 42.4. “settable JMS Header Properties” 에 설명된 적절한 설정 방법을 사용하여 설정할 값을 채웁니다.
  3. 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 헤더에 선택적 속성을 추가하려면 다음을 수행합니다.

  1. JMSPropertyType 오브젝트를 생성합니다.
  2. setName() 을 사용하여 속성의 이름을 설정합니다.
  3. setValue() 를 사용하여 속성의 값 필드를 설정합니다.
  4. JMSMessageHeadersType.getProperty().add(JMSPropertyType) 를 사용하여 JMS 메시지 헤더에 속성을 추가합니다.
  5. 모든 속성이 메시지 헤더에 추가될 때까지 절차를 반복합니다.

42.4.3.3. client Receive Timeout

JMS 헤더 속성 외에도 소비자 엔드포인트가 시간 초과하기 전에 응답을 대기하는 시간을 설정할 수 있습니다. org.apache.cxf.transports.jms.JMSConstants.JMSConstants.JMSConstants.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 를 가져옵니다.

InvocationHandlerBindingProvider 인지 확인합니다.

반환된 InvocationHandler 개체를 BindingProvider 개체로 캐스팅하여 요청 컨텍스트를 검색합니다. casts the returned InvocationHandler object into a BindingProvider object to retrieve the request context.

요청 컨텍스트를 가져옵니다.

새 메시지 헤더 값을 보유하는 JMSMessageHeadersType 오브젝트를 생성합니다.

Correlation ID를 설정합니다.

만료 속성을 60분으로 설정합니다.

JMSPropertyType 오브젝트를 생성합니다.

선택적 속성의 값을 설정합니다.

메시지 헤더에 선택적 속성을 추가합니다.

JMS 메시지 헤더 값을 요청 컨텍스트로 설정합니다.

클라이언트 수신 시간 초과 속성을 1초로 설정합니다.