14.5. WSDL을 사용하여 JMS 구성

14.5.1. JMSWS Extension Namespance

JMS 엔드포인트를 정의하는 WSDL 확장 기능은 네임스페이스 http://cxf.apache.org/transports/jms 에 정의되어 있습니다. JMS 확장을 사용하려면 예 14.5. “JMS WSDL 확장 네임스페이스” 에 표시된 줄을 계약의 정의 요소에 추가해야 합니다.

예 14.5. JMS WSDL 확장 네임스페이스

xmlns:jms="http://cxf.apache.org/transports/jms"

14.5.2. 기본 JMS 구성

14.5.2.1. 개요

JMS 주소 정보는 jms:address 요소 및 해당 하위인 jms:JMSNamingProperties 요소를 사용하여 제공됩니다. jms:address 요소의 속성은 JMS 브로커와 대상을 식별하는 데 필요한 정보를 지정합니다. jms:JMSNamingProperties 요소는 JNDI 서비스에 연결하는 데 사용되는 Java 속성을 지정합니다.

중요

JMS 기능을 사용하여 지정된 정보는 끝점의 WSDL 파일의 정보를 재정의합니다.

14.5.2.2. JMS 주소 지정

JMS 엔드포인트에 대한 기본 구성은 jms:address 요소를 서비스 포트 요소의 자식으로 사용하여 수행됩니다. WSDL에 사용된 jms:address 요소는 구성 파일에서 사용된 것과 동일합니다. 해당 속성은 표 14.2. “JMS 끝점 속성” 에 나열됩니다.

표 14.2. JMS 끝점 속성

속성설명

destinationStyle

JMS 대상이 JMS 대기열 또는 JMS 주제인지 여부를 지정합니다.

jndiConnectionFactoryName

JMS 대상에 연결할 때 사용할 JMS 연결 팩토리에 바인딩된 JNDI 이름을 지정합니다.

jmsDestinationName

전송되는 JMS 대상의 JMS 이름을 지정합니다.

jmsReplyDestinationName

응답이 전송되는 JMS 대상의 JMS 이름을 지정합니다. 이 특성을 사용하면 응답에 대해 사용자 정의 대상을 사용할 수 있습니다. 자세한 내용은 14.6절. “이름이 지정된 Reply Destination 사용” 에서 참조하십시오.

jndiDestinationName

전송되는 JMS 대상에 바인딩된 JNDI 이름을 지정합니다.

jndiReplyDestinationName

응답이 전송되는 JMS 대상에 바인딩된 JNDI 이름을 지정합니다. 이 특성을 사용하면 응답에 대해 사용자 정의 대상을 사용할 수 있습니다. 자세한 내용은 14.6절. “이름이 지정된 Reply Destination 사용” 에서 참조하십시오.

connectionUserName

JMS 브로커에 연결할 때 사용할 사용자 이름을 지정합니다.

connectionPassword

JMS 브로커에 연결할 때 사용할 암호를 지정합니다.

jms:address WSDL 요소는 jms:JMSNamingProperties 하위 요소를 사용하여 JNDI 공급자에 연결하는 데 필요한 추가 정보를 지정합니다.

14.5.2.3. JNDI 속성 지정

JMS 및 JNDI 공급자와의 상호 운용성을 높이기 위해 jms:address 요소에는 JNDI 공급자에 연결할 때 사용되는 속성을 채우는 데 사용되는 값을 지정할 수 있는 하위 요소 jms:JMSNamingProperties 가 있습니다. jms:JMSNamingProperties 요소에는 namevalue 의 두 가지 속성이 있습니다. name 은 설정할 속성의 이름을 지정합니다. value 속성은 지정된 속성의 값을 지정합니다. JMS:JMSNamingProperties 요소는 공급자별 속성의 사양에도 사용할 수 있습니다.

다음은 설정할 수 있는 공통 JNDI 속성 목록입니다.

  1. java.naming.factory.initial
  2. java.naming.provider.url
  3. java.naming.factory.object
  4. java.naming.factory.state
  5. java.naming.factory.url.pkgs
  6. java.naming.dns.url
  7. java.naming.authoritative
  8. java.naming.batchsize
  9. java.naming.referral
  10. java.naming.security.protocol
  11. java.naming.security.authentication
  12. java.naming.security.principal
  13. java.naming.security.credentials
  14. java.naming.language
  15. java.naming.applet

이러한 속성에서 사용할 정보에 대한 자세한 내용은 JNDI 공급자의 설명서를 확인하고 Java API 참조 자료를 참조하십시오.

14.5.2.4. 예제

예 14.6. “JMS WSDL 포트 사양” 는 JMS WSDL 포트 사양의 예를 보여줍니다.

예 14.6. JMS WSDL 포트 사양

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
  </port>
</service>

14.5.3. JMS 클라이언트 구성

14.5.3.1. 개요

JMS 소비자 엔드포인트는 사용하는 메시지 유형을 지정합니다. JMS 소비자 끝점은 JMS ByteMessage 또는 JMS TextMessage 를 사용할 수 있습니다.

ByteMessage 를 사용할 때 소비자 엔드포인트는 JMS 메시지 본문에 데이터를 저장하고 데이터를 검색하는 방법으로 byte[] 를 사용합니다. 메시지가 전송될 때, 포맷된 정보를 포함하는 메시지 데이터는 바이트[] 로 패키지되고, 그 메시지가 전선에 배치되기 전에 메시지 본문에 배치된다. 메시지가 수신되면 소비자 끝점은 바이트[] 에 패키징된 것처럼 메시지 본문에 저장된 데이터를 매끄럽게 표시하려고 합니다.

TextMessage 를 사용하는 경우 소비자 엔드포인트는 메시지 본문에서 데이터를 저장하고 검색하는 방법으로 문자열을 사용합니다. 메시지가 전송되면 모든 형식별 정보를 포함하는 메시지 정보가 문자열로 변환되어 JMS 메시지 본문에 배치됩니다. 메시지가 수신되면 소비자 끝점은 JMS 메시지 본문에 저장된 데이터를 문자열로 패딩하려고 합니다.

네이티브 JMS 애플리케이션이 Apache CXF 소비자와 상호 작용할 때 JMS 애플리케이션은 메시지 및 형식 정보를 해석해야 합니다. 예를 들어 Apache CXF 계약이 JMS 끝점에 사용되는 바인딩이 SOAP임을 지정하고 메시지가 TextMessage 로 패키징된 경우 수신 JMS 애플리케이션은 모든 SOAP 봉투 정보가 포함된 텍스트 메시지를 받습니다.

14.5.3.2. 메시지 유형 지정

JMS 소비자 끝점에서 허용하는 메시지 유형은 선택적 jms:client 요소를 사용하여 구성됩니다. jms:client 요소는 WSDL 포트 요소의 자식이며 하나의 특성을 갖습니다.

표 14.3. JMS Client WSDL Extensions

messageType

메시지 데이터를 JMS 메시지로 패키징하는 방법을 지정합니다. text 는 데이터가 TextMessage 로 패키징되도록 지정합니다. 바이너리 는 데이터가 ByteMessage 로 패키징되도록 지정합니다.

14.5.3.3. 예제

예 14.7. “JMS 소비자 엔드 포인트의 WSDL” 는 JMS 소비자 엔드 포인트를 구성하기 위한 WSDL을 보여줍니다.

예 14.7. JMS 소비자 엔드 포인트의 WSDL

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
    <jms:client messageType="binary" />
  </port>
</service>

14.5.4. JMS 공급자 구성

14.5.4.1. 개요

JMS 공급자 끝점에는 구성 가능한 여러 동작이 있습니다. 여기에는 다음이 포함됩니다.

  • 메시지가 상호 작용하는 방법
  • 내구성 서브스크립션 사용
  • 서비스가 로컬 JMS 트랜잭션을 사용하는 경우
  • 끝점에서 사용하는 메시지 선택기

14.5.4.2. 설정 지정

공급자 끝점 동작은 선택적 jms:server 요소를 사용하여 구성됩니다. jms:server 요소는 WSDL wsdl:port 요소의 하위이며 다음 속성이 있습니다.

표 14.4. JMS 공급자 끝점 WSDL 확장

속성설명

useMessageIDAsCorrealationID

JMS에서 메시지 ID를 사용하여 메시지의 상관 관계를 유지할지 여부를 지정합니다. 기본값은 false입니다.

durableSubscriberName

내구성 서브스크립션을 등록하는 데 사용되는 이름을 지정합니다.

messageSelector

사용할 메시지 선택기의 문자열 값을 지정합니다. 메시지 선택기를 지정하는 데 사용되는 구문에 대한 자세한 내용은 JMS 1.1 사양을 참조하십시오.

transactional

로컬 JMS 브로커가 메시지 처리와 관련된 트랜잭션을 생성할지 여부를 지정합니다. 기본값은 false입니다.[a]

[a] 현재 트랜잭션 특성을 true 로 설정하는 것은 런타임에서 지원되지 않습니다.

14.5.4.3. 예제

예 14.8. “JMS 공급자 끝점의 WSDL” 는 JMS 공급자 끝점 구성을 위한 WSDL을 보여줍니다.

예 14.8. JMS 공급자 끝점의 WSDL

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
    <jms:server messageSelector="cxf_message_selector"
                useMessageIDAsCorrelationID="true"
                transactional="true"
                durableSubscriberName="cxf_subscriber" />
  </port>
</service>