13.2. JMS URI

13.2.1. 개요

SOAP/JMS를 사용하는 경우 JMS URI를 사용하여 끝점의 대상 대상을 지정합니다. URI에 하나 이상의 옵션을 추가하여 JMS 연결을 구성하는 데 JMS URI를 사용할 수도 있습니다. 이러한 옵션은 IETF 표준, Java Message Service 1.0용 URI Scheme에 자세히 설명되어 있습니다. JNDI 시스템, 응답 대상, 사용할 전달 모드 및 기타 JMS 속성을 구성하는 데 사용할 수 있습니다.

13.2.2. 구문

예 13.4. “JMS URI 옵션의 구문” 에 표시된 대로 대상의 주소에서 물음표(?)로 구분하여 JMS URI 끝에 하나 이상의 옵션을 추가할 수 있습니다. 여러 옵션은 앰퍼샌드(&)로 구분됩니다. 예 13.4. “JMS URI 옵션의 구문” 는 JMS URI에서 여러 옵션을 사용하는 구문을 보여줍니다.

예 13.4. JMS URI 옵션의 구문

jms:variant:jmsAddress?option1=value1&option2=value2&_optionN_=valueN

13.2.3. JMS 속성

표 13.2. “URI 옵션으로 설정된 JMS 속성” 는 JMS 전송 계층에 영향을 주는 URI 옵션을 보여줍니다.

표 13.2. URI 옵션으로 설정된 JMS 속성

속성기본값설명

conduitIdSelectorPrefix

 

[선택 사항] conduit이 생성하는 모든 상관 관계 ID 앞에 있는 문자열 값입니다. 선택기는 이를 사용하여 응답을 수신할 수 있습니다.

deliveryMode

PERSISTENT

JMS PERSISTENT 또는 NON_PERSISTENT 메시지 의미 체계를 사용할지 여부를 지정합니다. PERSISTENT 전달 모드의 경우 JMS 브로커는 메시지를 인증하기 전에 영구 스토리지에 저장합니다. 반면 NON_PERSISTENT 메시지는 메모리에만 유지됩니다.

durableSubscriptionClientID

 

[선택 사항] 연결의 클라이언트 식별자를 지정합니다. 이 속성은 공급자가 클라이언트를 대신하여 유지 관리하는 상태와 연결을 연결하는 데 사용됩니다.This property is used to associate a connection with a state that the provider maintains on behalf of the client. 이를 통해 후속 ID를 가진 구독자는 이전 구독자가 남겨 두었던 상태에서 서브스크립션을 재개할 수 있습니다.

durableSubscriptionName

 

[선택 사항] 서브스크립션의 이름을 지정합니다.

messageType

byte

CXF에서 사용하는 JMS 메시지 유형을 지정합니다. 유효한 값은 다음과 같습니다.

  • byte
  • text
  • Binary

암호

 

[선택 사항] 연결 생성을 위한 암호를 지정합니다. URI에 이 속성을 추가하는 것은 권장되지 않습니다.

priority

4

0(최저)에서 9(최고) 사이의 범위인 JMS 메시지 우선 순위를 지정합니다.

receiveTimout

60000

요청/복원 교환이 사용될 때 클라이언트가 응답을 기다리는 시간을 지정합니다.Specifies the time, in milliseconds, the client will wait for a reply when request/reply exchange are used.

reconnectOnException

true

[CXF 3.0에서 사용 중지됨] 예외가 발생할 때 전송이 다시 연결되는지 여부를 지정합니다.

3.0에서는 예외가 발생할 때 항상 전송이 다시 연결됩니다.

replyToName

 

[선택 사항] 큐 메시지의 응답 대상을 지정합니다. 응답 대상은 JMSReplyTo 헤더에 나타납니다. JMS 공급자가 지정되지 않은 경우 임시 응답 큐를 할당하므로 request-reply 의미가 있는 애플리케이션에 이 속성을 설정하는 것이 좋습니다.

이 속성의 값은 JMS URI에 지정된 변형에 따라 해석됩니다.

  • JNDI 변형 - JNDI로 확인된 대상 대기열의 이름입니다.
  • queue variant- JMS를 사용하여 확인된 대상 대기열의 이름입니다.

sessionTransacted

false

트랜잭션 유형을 지정합니다. 유효한 값은 다음과 같습니다.

  • true-resource 로컬 트랜잭션
  • False-JTA 트랜잭션

timeToLive

0

JMS 공급자가 메시지를 삭제할 시간(밀리초)을 지정합니다. 값 0은 무한한 수명을 나타냅니다.A value of 0 indicates an infinite lifetime.

topicReplyToName

 

[선택 사항] 주제 메시지의 응답 대상을 지정합니다. 이 속성의 값은 JMS URI에 지정된 변형에 따라 해석됩니다.

  • JNDI-topic -JNDI로 확인된 대상 항목의 이름입니다.
  • topic- JMS에서 해결한 대상 항목의 이름입니다.

useConduitIdSelector

true

conduit의 UUID가 모든 상관 관계 ID의 접두사로 사용되는지 여부를 지정합니다.

모든 conduits에는 고유한 UUID가 할당되므로 이 속성을 true 로 설정하면 여러 끝점이 JMS 대기열 또는 주제를 공유할 수 있습니다.

사용자 이름

 

[선택 사항] 연결을 만드는 데 사용할 사용자 이름을 지정합니다.

13.2.4. JNDI 속성

표 13.3. “URI 옵션으로 설정된 JNDI 속성” 는 이 엔드포인트에 대해 JNDI를 구성하는 데 사용할 수 있는 URI 옵션을 보여줍니다.

표 13.3. URI 옵션으로 설정된 JNDI 속성

속성설명

jndiConnectionFactoryName

JMS 연결 팩토리의 JNDI 이름을 지정합니다.

jndiInitialContextFactory

JNDI 공급자의 정규화된 Java 클래스 이름을 지정합니다(Java x.jms.InitialContextFactory 유형 여야 함). java.naming.factory.initial Java 시스템 속성을 설정하는 것과 동일합니다.

jndiTransactionManagerName

Spring, Blueprint 또는 JNDI에서 검색할 JTA 트랜잭션 관리자의 이름을 지정합니다. 트랜잭션 관리자가 발견되면 JTA 트랜잭션이 활성화됩니다. sessionTransacted JMS 속성을 참조하십시오.

jndiURL

JNDI 공급자를 초기화하는 URL을 지정합니다. java.naming.provider.url Java 시스템 속성을 설정하는 것과 동일합니다.

13.2.5. 추가 JNDI 속성

java.naming.factory.initialjava.naming.provider.url 의 속성은 JNDI 공급자를 초기화하는 데 필요한 표준 속성입니다. 그러나 JNDI 공급자는 표준 속성 외에도 사용자 정의 속성을 지원할 수도 있습니다. 이 경우 jndi-PropertyName 형식의 URI 옵션을 설정하여 임의의 JNDI 속성을 설정할 수 있습니다.

예를 들어, JNDI의 SUN의 LDAP 구현을 사용하는 경우 예 13.5. “JMS URI에서 JNDI 속성 설정” 과 같이 JMS URI에서 JNDI 속성 java.naming.factory.control 을 설정할 수 있습니다.

예 13.5. JMS URI에서 JNDI 속성 설정

jms:queue:FOO.BAR?jndi-java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory

13.2.6. 예제

JMS 공급자가 아직 구성되지 않은 경우 옵션을 사용하여 URI에 필수 JNDI 구성 세부 정보를 제공할 수 있습니다( 표 13.3. “URI 옵션으로 설정된 JNDI 속성”참조). 예를 들어 Apache ActiveMQ JMS 공급자를 사용하도록 엔드포인트를 구성하고 test.cxf.jmstransport.queue 라는 큐에 연결하려면 예 13.6. “JNDI 연결을 구성하는 JMS URI” 에 표시된 URI를 사용합니다.

예 13.6. JNDI 연결을 구성하는 JMS URI

jms:jndi:dynamicQueues/test.cxf.jmstransport.queue
?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory
&jndiConnectionFactoryName=ConnectionFactory
&jndiURL=tcp://localhost:61616

13.2.7. 서비스 게시

JAX-WS 표준 publish() 메서드를 사용하여 SOAP/JMS 서비스를 게시할 수 없습니다. 대신 예 13.7. “SOAP/JMS 서비스 게시” 과 같이 Apache CXF의 JaxWsServerFactoryBean 클래스를 사용해야 합니다.

예 13.7. SOAP/JMS 서비스 게시

String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
    + "?jndiInitialContextFactory"
    + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
    + "&jndiConnectionFactoryName=ConnectionFactory"
    + "&jndiURL=tcp://localhost:61500";
Hello implementor = new HelloImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(Hello.class);
svrFactory.setAddress(address);
svrFactory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
svrFactory.setServiceBean(implementor);
svrFactory.create();

예 13.7. “SOAP/JMS 서비스 게시” 의 코드는 다음을 수행합니다.

끝점의 주소를 나타내는 JMS URI를 생성합니다.

JaxWsServerFactoryBean 을 인스턴스화하여 서비스를 게시합니다.

서비스의 JMS URI를 사용하여 팩토리 빈의 address 필드를 설정합니다.

팩토리에 의해 생성된 서비스가 SOAP/JMS 전송을 사용하도록 지정합니다.

13.2.8. 서비스 사용

표준 JAX-WS API는 SOAP/JMS 서비스를 사용하는 데 사용할 수 없습니다. 대신 예 13.8. “SOAP/JMS 서비스 사용” 과 같이 Apache CXF의 JaxWsProxyFactoryBean 클래스를 사용해야 합니다.

예 13.8. SOAP/JMS 서비스 사용

// Java
public void invoke() throws Exception {
    String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
        + "?jndiInitialContextFactory"
        + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
        + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61500";
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setAddress(address);
    factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
    factory.setServiceClass(Hello.class);
    Hello client = (Hello)factory.create();
    String reply = client.sayHi(" HI");
    System.out.println(reply);
}

예 13.8. “SOAP/JMS 서비스 사용” 의 코드는 다음을 수행합니다.

끝점의 주소를 나타내는 JMS URI를 생성합니다.

JaxWsProxyFactoryBean 을 인스턴스화하여 프록시를 생성합니다.

서비스의 JMS URI를 사용하여 팩토리 빈의 address 필드를 설정합니다.

팩토리에서 생성한 프록시가 SOAP/JMS 전송을 사용하도록 지정합니다.