7 장. JBoss에서의 커넥터

JCA 환경설정과 아키텍쳐

이번 장에서는 J2EE 커넥터 아키텍쳐(JCA)에 대한 JBoss 서버 구현에 관해 논의하겠습니다. JCA는 관계형 데이터베이스로 액세스하기위해 표준화된 JDBC API를 사용하는 것과 동일한 방식으로 비-관계형 리소스들로의 액세스를 표준화할 목적을 갖는 리소스 관리자 통합 API입니다. 이번 장의 목적은 JCA API에 대한 유틸리티를 소개하고 JBoss에서의 JCA 아키텍쳐를 설명하는 것입니다.

7.1. JCA 개요

J2EE 1.3에는 J2EE 어플리케이션 서버 환경내로 트랜잭션과 안전한 리소스 아답터들의 통합을 가능하게하는 커넥터 아키텍쳐(JCA) 시방서가 포함되어 있습니다. JCA 시방서의 완전한 버전은 JCA 홈페이지(http://java.sun.com/j2ee/connector/)에서 구할 수 있습니다. JCA 시방서에서는 엔터프라이즈 인포메이션 시스템(EIS)로써의 리소스 관리자들과 같은 표기가 설명되어 있습니다. EIS 시스템의 예제에는 엔터프라이즈 리소스 플래닝 패키지, 메인프레임 트랜잭션 처리, 비-자바 레거시 어플리케이션등이 포함되어 있습니다.

EIS에 촛점을 맞추는 이유중에 가장 큰 것은 트랜잭션, 보안 그리고 확장성 표기가 엔터프라이즈 소프트웨어 시스템에 필수요소이기 때문입니다. 하지만, JCA는 JBoss쪽에 통합시켜야할 필요가 있는 리소스들을 안전하면서도 확장가능하고 트랜잭션 형태를 갖도록 하고자 할때 적합합니다. 이번 소개에서 우리는 EIS 환경에 국한되시키기 보단 범용적인 표기를 사용하여 리소스 아답터를 이야기 하도록 하겠습니다.

커넥터 아키텍쳐에서는 트랜잭션, 보안 그리고 커넥션 관리에 대한 리소스 관리자를 갖고 있는 어플리케이션 서버의 트랜잭션, 보안 및 커넥션 관리 기능성의 통합을 위한 표준 SPI(서비스 제공 인터페이스)가 정의됩니다. SPI에서는 리소스 아답터와 어플리케이션 사이에서의 시스템 수준의 계약사항을 정의합니다.

또한 커넥션 아키텍쳐에서는 리소스에 액세스하기위한 범용 클라이언트 인터페이스(CCI-Common Client Interface)도 정의됩니다. CCI는 EIS 개발 도구들과 통합된 리소스의 능숙한 사용자들위해 도입되었습니다. CCI에서는 도구들에서 필요로 하는 EIS 특정 코드를 최소화하는 방안을 제공합니다. 일반적으로 J2EE 개발자들은 CCI를 직접 사용하기보다는 도구나 리소스에 특정한 인터페이스를 사용하여 리소스로 액세스하게 됩니다. 이것은 CCI가 특정 API 타입이 아니기 때문입니다. 효과적으로 사용하기위해서는 리소스 관리자에 의해 내부적으로 사용되는 리소스 관리자의 특정한 데이터 타입들을 범용 CCI API에 어떻게 매핑시키는지를 기술하는 메터데이터를 이용해야만 합니다.

커넥터 아키텍쳐의 목적은 리소스 벤더들이 자신의 제품에서 표준 아답터를 제공할 수 있도록 하는 것입니다. 리소스 아답터는 자바 어플리케이션이 리소스에 연결하는데 사용하는 시스템 레벨의 소프트웨어 드라이버입니다. 리소스 아답터는 어플리케이션 서버쪽에 플러그인되어 리소스 관리자와 어플리케이션 서버 그리고 엔터프라이즈 어플리케이션 사이에서 연결을 제공합니다. 리소스 벤더는 어떠한 JCA 호환 어플리케이션 서버에서도 리소스 관리자를 사용할 수 있도록 하기위해서 JCA 호환 아답터를 한번만 구현해주면 됩니다.

어플리케이션 서버 벤더는 커넥터 아키텍쳐를 지원할 수 있도록 한번만 자신의 아키텍쳐를 확장해주게 되면 다양한 리소스 관리자로 연결할 수 있게 됩니다. 이와 유사하게 하나의 리소스 관리자 벤더는 표준 리소스 아답터 하나만을 제공함으로써 커넥터 아키텍쳐를 지원하는 어떠한 어플리케이션 서버쪽에서도 플러그인될 수 있습니다.

J2EE 어플리케이션 서버와 JCA 리소스 아답터사이의 관계

그림 7.1. J2EE 어플리케이션 서버와 JCA 리소스 아답터사이의 관계

그림 7.1, “J2EE 어플리케이션 서버와 JCA 리소스 아답터사이의 관계”에서는 서버 커텍션 풀링, 트랜잭션 관리 그리고 보안 관리 기능을 통합시키기 위한 리소스 아답터가 가능하도록 하는 JCA SPI에 대한 지원을 제공하기 위해 확장되어진 어플리케이션 서버를 보여주고 있습니다.

리소스 아답터는 시스템 계약(contract)의 측면에서 리소스 관리자를 구현합니다. 이것은 어플리케이션 서버 커넥션 풀링, 트랜잭션 리소스 정보 제공과 보안 통합 정보의 사용을 수반합니다. 또한 리소스 아답터는 리소스 관리자를 어플리케이션 서버 컴포넌트들에게 노출시킵니다. 이것은 CCI 그리고/또는 리소스 아답터에 특정한 API를 사용하여 가능하게 됩니다.

어플리케이션 컴포넌트는 컴포넌트 계약에 따라 표준 J2EE 컨테이너를 사용하여 어플리케이션 서버쪽으로 통합되어집니다. EJB 컴포넌트의 경우, 이러한 계약은 EJB 사양서에서 정의됩니다. 어플리케이션 컴포넌트는 javax.sql.DataSource JDBC 리소스 팩토리처럼 다른 표준 리소스 팩토리들과 상호작용되는 방식과 동일하게 리소스 관리자와도 상호작용합니다. JCA 리소스 아답터와 유일하게 다른 점은 리소스 아답터가 CCI API를 지원하는 경우 리소스 아답터에 독립적인 CCI API를 사용하는 옵션을 갖는 클라이언트라는 것입니다.

그림 7.2, “커넥션 관리 아키텍쳐에 대한 JCA 1.0 사양 클래스 다이어그램.” (JCA 1.0 시방서로부터)에서는 JCA 아키텍쳐 구성요소들사이의 관계를 JCA SPI, CCI 그리고 JTA팩키지와 어떤 관련을 갖는지에 대한 측면에서 보여주고 있습니다.

커넥션 관리 아키텍쳐에 대한 JCA 1.0 사양 클래스 다이어그램.

그림 7.2. 커넥션 관리 아키텍쳐에 대한 JCA 1.0 사양 클래스 다이어그램.

JBossCX 아키텍쳐는 어플리케이션 서버에 특정한 클래스들의 구현을 제공합니다. 그림 7.2, “커넥션 관리 아키텍쳐에 대한 JCA 1.0 사양 클래스 다이어그램.” 에서는 이것이 javax.resource.spi.ConnectionManagerjavax.resource.spi.ConnectionEventListener 인터페이스들의 구현에 적용되었음을 보여주고 있습니다.

7.2. JBossCX 아키텍쳐의 개요

JBossCX 프레임워크에서는 JCA 리소스 아답터들의 사용에 필요한 어플리케이션 서버 아키텍쳐 확장이 제공됩니다. JBoss 서버쪽으로 리소스 아답터들을 로딩하기위한 많은 MBean들과 함께 커넥션 풀링 그리고 관리 확장이 주가 됩니다. 그림 7.3, “JBoss JCA 구현 컴포넌트들” 은 이번 장의 후반부에서 보게될 파일 시스템 리소스 아답터 예제에서의 어플리케이션 서버에 특정한 확장을 JBoss JCA 계층에서 어떻게 구현하는지를 보여주는 그림 7.2, “커넥션 관리 아키텍쳐를 위한 JCA 1.0 시방서 클래스 다이어그램.” 에서 주어진 일반적인 뷰의 확장입니다.

JBoss JCA 구현 컴포넌트들

그림 7.3. JBoss JCA 구현 컴포넌트들

RAR 배치를 구성하는데는 3개의 MBean들이 합쳐져 있습니다. 이 3개의 MBean은 바로 org.jboss.resource.RARDeployment, org.jboss.resource.connectionmanager.RARDeployment, 그리고 org.jboss.resource.connectionmanager.BaseConnectionManager2 입니다. org.jboss.resource.RARDeployment는 RAR META-INF/ra.xml 서술자의 메터데이터를 간단히 감싸준 것입니다. 이것은 간단히 DynamicMBean으로써 정보를 노출시켜 org.jboss.resource.connectionmanager.RARDeployment MBean에서 사용가능토록 합니다.

RARDeployer 서비스에서는 리소스 아답터(RAR)들을 포함하는 아카이브 파일의 배치를 처리합니다. 이것은 RAR 파일이 배치되면 org.jboss.resource.RARDeployment MBeans을 생성합니다. RAR 파일을 배치한다는 것은 어플리케이션 컴포넌트들쪽에서 리소스 아답터를 사용할 수 있게 하는 첫 번째 단계입니다. 배치된 각각의 RAR는 하나 이상의 커넥션 팩토리를 설정해주어야만 하고 JNDI쪽에 바운드 되어져야만 합니다. 이러한 작업은 org.jboss.resource.connectionmgr.RARDeployment에 의존성을 갖는 org.jboss.resource.connectionmanager.BaseConnectionManager2 MBean 구현을 설정해주는 JBoss 서비스 서술자를 사용하여 수행되어집니다.

7.2.1. BaseConnectionManager2 MBean

org.jboss.resource.connectionmanager.BaseConnectionManager2 MBean은 JCA 스펙에서 요구되어지는 커넥션 관리자들의 다양한 타입을 위한 기본 클래스입니다. 서브클래스에는 (org.jboss.resource.connectionmanager) NoTxConnectionManager, LocalTxConnectionManager 그리고 XATxConnectionManager가 포함됩니다. 이것들은 트랜잭션이 없는 것, 로컬 트랜잭션 그리고 XA 트랜잭션을 지원하는 리소스 아답터 각각에 대응됩니다. 여러분이 원하는 트랜잭션 시맨틱 타입에 따라 사용할 서브클래스를 선택하고, 대응되는 트랜잭션 기능을 지원하는 JCA 리소스 아답터를 제공하십시오.

BaseConnectionManager2 MBean 에서 지원하는 일반적인 속성들은 다음과 같습니다:

  • ManagedConnectionFactoryName: 이것은 javax.resource.spi.ManagedConnectionFactory 인스턴스들을 생성하는 MBean의 ObjectName을 지정합니다. 일반적으로 이것은 RARDeployment MBean을 사용하는 별도의 MBean 레퍼런스보다는 depends 요소안에 내장된 MBean으로 설정되어집니다. MBean은 다음과 같은 서명(signature)을 갖는 오퍼레이션을 제공해야만 합니다:
    javax.resource.spi.ManagedConnectionFactory startManagedConnectionFactory(javax.resource.spi.ConnectionManager)
  • ManagedConnectionPool: 이것은 커넥션 관리자를 위한 풀(pool)을 표시해주는 MBean의 ObjectName을 지정합니다. MBean은 org.jboss.resource.connectionmanager.ManagedConnectionPool 인터페이스의 구현인 ManagedConnectionPool 속성을 가져야만 합니다. 일반적으로 이것은 기존 MBean을 참조하는 ObjectName 보다는 depends 태그내에 내장된 MBean이게 됩니다. 사용되는 기본 MBean은 org.jboss.resource.connectionmanager.JBossManagedConnectionPool 입니다. 설정가능한 속성들은 아래쪽에 기술되어 있습니다.
  • CachedConnectionManager: 이것은 커넥션 관리자에서 사용되는 (org.jboss.resource.connectionmanager) CachedConnectionManager MBean 구현의 ObjectName을 지정합니다. 일반적으로 이것은 서버에 대해 고유한 CachedConnectionManager의 ObjectName을 갖는 depends 태그를 사용하여 지정되게 됩니다. jboss.jca:service=CachedConnectionManager 이름은 사용하기위한 표준 설정입니다.
  • SecurityDomainJndiName: 이것은 리소스 연결의 인증과 인가에 사용되는 보안 도메인의 JNDI 이름을 지정합니다. 이것은 일반적으로 java:/jaas/<domain> 형태를 갖으며, 여기서 <domain>값은 conf/login-config.xml JAAS 로그인 모듈 설정 파일내의 항목 이름입니다. 이것은 인증을 수행하는 JAAS 로그인 모듈이 어떤 것인지를 정의합니다. 8 장, JBoss에서의 보안에서 보안 설정에 대한 정보가 보다 잘 기술되어 있습니다.
  • JaasSecurityManagerService: 이것은 보안 관리자 서비스의 ObjectName입니다. 이것은 conf/jboss-service.xml 서술자내에서 정의된 보안 관리자 MBean 이름으로 설정되어져야 하고, 현재 이것은 jboss.security:service=JaasSecurityManager입니다. 이 속성은 향후 없어질 수 있습니다.

7.2.2. RARDeployment MBean

org.jboss.resource.connectionmanager.RARDeployment MBean은 ManagedConnectionFactory 인스턴스의 설정과 초기화를 관리합니다. 이것은 RAR META-INF/ra.xml 서술자의 RARDeployment 속성들을 이용하여 리소스 아답터 설정을 합니다. 설정가능한 속성들은 다음과 같습니다:

  • OldRarDeployment: 리소스 아답터의 메터데이터를 포함하고 있는 org.jboss.resource.RarDeployment MBean의 ObjectName입니다. 이 이름의 형태는 jboss.jca:service=RARDeployment,name=<ra-display-name> 이며, 여기서 <ra-display-name>ra.xml 서술자의 display-name 속성 값입니다. 이것은 RAR 파일을 배치시킬 때 RARDeployer에 의해 생성됩니다. 이 속성은 향후에는 없어지게 될 수도 있습니다.
  • ManagedConenctionFactoryProperties: 이것은 ManagedConnectionFactory 인스턴스의 속성을 정의해주는 세개(name, type, value)의 컬렉션입니다. 따라서 속성의 이름은 리소스 아답터 ManagedConnectionFactory 인스턴스에 종속적입니다. 다음 예제에서는 이 속성의 컨텐츠 구조를 보여주고 있습니다.
    <properties>
        <config-property>
            <config-property-name>Attr0Name</config-property-name>
            <config-property-type>Attr0Type</config-property-type>
            <config-property-value>Attr0Value</config-property-value>
        </config-property>
        <config-property>
            <config-property-name>Attr1Name</config-property-name>
            <config-property-type>Attr2Type</config-property-type>
            <config-property-value>Attr2Value</config-property-value>
        </config-property> 
        ...
    </properties>  
    

    AttrXName는 X번째속성의 이름으로 AttrXType는 속성에 대한 완전한 형태의 자바 타입이고 AttrXValue는 값을 나타내는 문자열입니다. 문자열을 AttrXType으로 변환하는 것은 AttrXTypejava.beans.PropertyEditor 클래스를 사용해서 이루어지게 됩니다.

  • JndiName: 사용가능하게 되는 JNDI의 이름입니다. 리소스 아답터의 클라이언트는 이 이름을 사용하여 javax.resource.cci.ConnectionFactory나 커넥션 팩토리에 특정한 리소스 아답터중 하나를 얻습니다. 완전한 JNDI 이름은 java:/<JndiName>이 되고, 이 의미는 JndiName의 속성 값이 java:/ 전치사가 붙게 된다는 것입니다. 이것은 커넥션 팩토리가 JBoss 서버 VM 외부에서 사용되는 것을 방지합니다. 향후에는 이러한 제한사항을 설정가능하도록 만들수도 있습니다.

7.2.3. JBossManagedConnectionPool MBean

org.jboss.resource.connectionmanager.JBossManagedConnectionPool MBean은 커넥션 풀링 MBean 입니다. 이것은 일반적으로 BaseConnectionManger2ManagedConnectionPool속성의 내장된 MBean 값으로 사용됩니다. 여러분이 커넥션 관리자 MBean을 설정할 때는 보통 커넥션 관리자 서술자내에서 풀 설정을 내장시키게 됩니다. JBossManagedConnectionPool의 설정가능한 속성들은 다음과 같습니다:

  • MinSize: 이 속성은 이 풀에서 가지고 있는 연결의 최소 개수를 지정합니다. 이것은 커넥션을 위한 요청으로부터 Subject를 알기전까지는 생성되지 않습니다. MinSize 연결은 각각의 서브-풀(sub-pool)에 대해 생성될 것입니다.
  • MaxSize: 이 속성은 풀에 대한 연결의 최대 개수를 지정합니다. MaxSize 연결을 넘어서는 연결은 각 서브-풀내에 생성되지 않습니다.
  • BlockingTimeoutMillis: 이 속성은 예외처리전에 연결에 대한 대기상태동안 블럭킹하는 최대 시간을 지정합니다. 이 블럭킹은 연결에 대한 허용에 따르는 대기동안만 유효하고 새로운 연결을 생성시키는데 비정상적으로 오랜 시간이 소요되는 경우에는 예외가 발생되지 않게된다는 것에 주의해야 합니다.
  • IdleTiemoutMinutes: 이 속성은 연결이 닫히기전까지 유휴상태로 있는 최대 시간을 지정합니다. 실제 최대 시간은 유휴 제거 쓰레드의 스캔 시간에도 영향을 받으며, 여기서 유휴 제거 쓰레드의 스캔 시간은 풀중에 가장 작은 유휴 타임아웃의 1/2 값입니다.
  • NoTxSeperatePools: 이 값을 true로 설정하면 가용한 풀들을 두배로 늘리게 됩니다. 풀 하나는 외부 트랜잭션을 사용하는 연결을 위한 것이고, 다른 하나는 트랜잭션 내부를 위한것입니다. 실제 풀은 처음 사용할때나 되어서야 구성됩니다. 이것은 LocalTxConnectionManagerXATxConnectionManager에 관련된 풀의 매개변수들을 설정할때만 관련됩니다. 이것의 사용예는 JTA 트랜잭션을 갖거나 갖지않는 XA 커넥션을 사용하는 것을 싫어하는 오라클(그리고 다른 벤더들도 가능한)의 XA 구현을 들 수 있습니다.
  • Criteria: 이 속성은 연결과 관련된 보안 도메인으로부터의 JAAS javax.security.auth.Subject나 어플리케이션에서 제공하는 파라메터들 (getConnection(user, pw)에서와 같은)이 풀내에서 연결들을 구분하는데 사용되는지를 지정합니다. 여기에 올수있는 값들은 다음과 같습니다:
    • ByContainer: Subject 사용
    • ByApplication: 어플리케이션에서 제공하는 매개변수만을 사용
    • ByContainerAndApplication: 두개 모두 사용
    • ByNothing: 일반적으로 아답터가 재인증을 지원할 경우 모든 연결들은 동일합니다.

7.2.4. CachedConnectionManager MBean

org.jboss.resource.connectionmanager.CachedConnectionManager MBean은 사용자 트랜잭션과 연결 처리사이에서 처럼 meta-aware 객체들(인터셉터 체인을 통해 액세스되는 것들)과 연결 처리사이에서 관계들을 관리합니다. 보통 이러한 MBean은 하나만이 존재하게 되며, 코어 jboss-service.xml 서술자내에서 설정되어집니다. 이것은 org.jboss.resource.connectionmanager.CachedConnectionInterceptor, JTA javax.transaction.UserTransaction 구현, 및 모든 BaseConnectionManager2 인스턴스들에서 사용됩니다. CachedConnectionManager MBean의 설정가능한 속성들은 다음과 같습니다:

  • SpecCompliant: 비-공유가능 연결들의 재연결 프로세싱 스펙 호환성을 위한 부울린 속성을 가능하게 합니다. 이것은 하나의 호출내에서 열려진 연결을 다른쪽에서 사용할 수 있게 합니다. 이 동작을 지정하면 연결 닫기 프로세싱이 않된다는 것에 주의하십시오.
  • Debug: 연결 닫기 프로세싱을 위한 부울린 속성을 가능하게 합니다. EJB 메쏘드 호출의 종료시점에서, 닫히지 않은 연결들은 트랜잭션 동기화에 등록되어집니다. 트랜잭션이 연결을 닫지않고 끝나게 될경우, 에러가 보고되고 JBoss가 연결을 닫습니다. 이것은 개발 기능으로써 최적의 성능을 위한 적용환경에서는 꺼 놓아야만 합니다.
  • TransactionManagerServiceName: 이 속성에서는 JTA 트랜잭션 관리자 서비스의 JMX ObjectName을 지정합니다. 연결 닫기 프로세싱은 이제 트랜잭션 관리자와 동기화되며 이 속성은 사용되는 트랜잭션 관리자를 지정합니다.

7.2.5.  JCA 리소스 아답터의 샘플 골격(Skeleton)

JBoss JCA 프레임워크에 대한 우리의 논의를 종결시키기위해 우리는 필요한 인터페이스들을 스터브로 내보내고 모든 메쏘드 호출을 로깅하는 골격 구현을 간단히 제공하는 단일 비-트랜잭션 리소스 아답터를 만들어 배치시킬 것입니다. 우리는 JCA 시방서에서 상세히 논의되는 것처럼 리소스 아답터 프로바이더의 요구사항에 대한 자세한 사항들을 다루지 않을 것입니다. 이 아답터의 목적은 JBoss내에서 RAR을 생성하고 배치하는데 필요한 과정들을 보여주고 또한 JBoss가 이 아답터와 어떻게 상호작용하는지를 보여주는 것입니다.

우리가 만들 아답터는 비-트랜잭션 파일 시스템 아답터를 위한 출발점으로 삼을 수 있습니다. 예제 아답터를 위한 소스는 이 책의 예제 src/main/org/jboss/chap7/ex1 디렉터리에서 찾을 수 있습니다. 그림 7.4, “파일 시스템 RAR 클래스 다이어그램”에서는 필요로 하는 javax.resource.spi 인터페이스로부터 리소스 아답터 구현쪽으로의 매핑을 보여주는 클래스 다이어그램입니다.

파일 시스템 RAR 클래스 다이어그램

그림 7.4. 파일 시스템 RAR 클래스 다이어그램

우리는 아답터를 빌드하고 JBoss 서버쪽으로 배치한 후 리소스 아답터를 사용하는 EJB에 대한 예제 클라이언트를 실행시킴으로써 하나의 완전한 컨텍스트에서 이루어지는 기본 단계들을 보여주게 됩니다. 그런 후에는 JBoss 서버쪽의 로그를 살펴봄으로써 JBoss JCA 프레임워크가 리소스 아답터와 어떻게 상호작용하는지를 알 수 있게 하여 여러분이 JCA 시스템 수준의 계약내에서의 컴포넌트들에 대한 이해의 폭을 넓힐 수 있도록 하겠습니다.

예제를 빌드하고 JBoss 서버쪽의 deploy/lib 디렉터리에 RAR를 배치하기 위해서는 다음과 같이 예제 디렉토리에 있는 Ant 명령을 실행시킵니다.

[nr@toki]$ ant -Dchap=chap7 build-chap
Buildfile: build.xml

...
prepare:
    [mkdir] Created dir: /Users/orb/proj/jboss/education/books/admin-devel/examples/output/chap7

chap7-ex1-rar:
      [jar] Building jar: /Users/orb/proj/jboss/education/books/admin-devel/examples/output/chap7/ra.jar
      [jar] Building jar: /Users/orb/proj/jboss/education/books/admin-devel/examples/output/chap7/chap7-ex1.rar

prepare:

chap7-ex1-jar:
      [jar] Building jar: /Users/orb/proj/jboss/education/books/admin-devel/examples/output/chap7/chap7-ex1.jar

BUILD SUCCESSFUL

배치되는 파일에는 tt class="literal">chap7-ex1.sar 와 하나의 notxfs-service.xml 서비스 서술자가 포함되어 있습니다. 예제 리소스 아답터 배치 서술자는 예제 7.1, “비-트랜잭션 파일 시스템 리소스 아답터 배치 서술자.”에 보여지며, 연결 관리자 MBeans 서비스 서술자는 예제 7.2, “notxfs-ds.xml 리소스 아답터 MBeans 서비스 서술자.”에서 보여주고 있습니다.

예제 7.1. 비-트랜잭션 파일 시스템 리소스 아답터 배치 서술자.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE connector PUBLIC
          "-//Sun Microsystems, Inc.//DTD Connector 1.0//EN"
          "http://java.sun.com/dtd/connector_1_0.dtd">
<connector>
    <display-name>File System Adapter</display-name>
    <vendor-name>JBoss Group</vendor-name>
    <spec-version>1.0</spec-version>
    <version>1.0</version>
    <eis-type>FileSystem</eis-type>
    <license>
        <description>LGPL</description>
        <license-required>false</license-required>
    </license>
    <resourceadapter>
        <managedconnectionfactory-class>
            org.jboss.chap7.ex1.ra.FSMangedConnectionFactory 
        </managedconnectionfactory-class>
        <connectionfactory-interface>
            org.jboss.chap7.ex1.ra.DirContextFactory 
        </connectionfactory-interface>

        <connectionfactory-impl-class>
            org.jboss.chap7.ex1.ra.DirContextFactoryImpl
        </connectionfactory-impl-class>
        <connection-interface>javax.naming.directory.DirContext</connection-interface>
        <connection-impl-class>org.jboss.chap7.ex1.ra.FSDirContext</connection-impl-class>
        <transaction-support>NoTransaction</transaction-support>
        <config-property>
            <config-property-name>FileSystemRootDir</config-property-name>
            <config-property-type>java.lang.String</config-property-type>
            <config-property-value>/tmp/db/fs_store</config-property-value>
        </config-property>
        <config-property>
            <config-property-name>UserName</config-property-name>
            <config-property-type>java.lang.String</config-property-type>
            <config-property-value/>
        </config-property>
        <config-property>
            <config-property-name>Password</config-property-name>
            <config-property-type>java.lang.String</config-property-type>
            <config-property-value/>
        </config-property>
        <authentication-mechanism>
            <authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
            <credential-interface>
                javax.resource.security.PasswordCredential
            </credential-interface>
        </authentication-mechanism>
        <reauthentication-support>true</reauthentication-support>
        <security-permission>
            <description>
                Read/Write access is required to the contents of the FileSystemRootDir
            </description>
            <security-permission-spec>permission java.io.FilePermission
                "/tmp/db/fs_store/*", "read,write";</security-permission-spec>
        </security-permission>
    </resourceadapter>
</connector>

예제 7.2. notxfs-ds.xml 리소스 아답터 MBeans 서비스 서술자.

<!-- The non-transaction FileSystem resource adaptor service configuration -->
<connection-factories>
    <no-tx-connection-factory>
        <jndi-name>NoTransFS</jndi-name>
        <adapter-display-name>File System Adapter</adapter-display-name>
        <config-property name="FileSystemRootDir"
                         type="java.lang.String">/tmp/db/fs_store</config-property>
    </no-tx-connection-factory>
</connection-factories>

리소스 아답터 배치 서술자에서의 중요한 항목들이 굵은체로 표시되어져 있습니다. 여기서는 리소스 아답터의 클래스와 요소들을 다음과 같이 정의하고 있습니다:

  • display-name: 팩토리와 리소스 아답터 클래스들 사이의 관계를 name 의해 위치된 RARDeploymentDynamicMBean을 통해 구현하는 연결 관리자 팩토리 MBeans에 대한 우리의 논의를 기억해보십시오. name은 ra.xml 서술자내에서 찾을 수 있는 display-name 값에 기초를 두고 있습니다. 여기서의 name은 File System Adaptor 입니다. 우리는 연결 관리자 서비스 서술자내에서 이것을 사용할 것입니다.
  • managedconnectionfactory-class: javax.resource.spi.ManagedConnectionFactory 인터페이스인 org.jboss.chap7.ex1.ra.FSMangedConnectionFactory의 구현.
  • connectionfactory-interface: 클라이언트가 JNDI로부터 연결 팩토리 인스턴스를 룩업할 때 획득하게 되는 인터페이스로 여기서는 소유자의(proprietary) 리소스 아답터 값인 org.jboss.chap7.ex1.ra.DirContextFactory가 됩니다.
  • connectionfactory-impl-class: connectionfactory-interface의 구현인 org.jboss.chap7.ex1.ra.DirContextFactoryImpl을 제공하는 클래스.
  • connection-interface: 리소스 아답터 연결 팩토리에 의해 반환되는 연결에 대한 인터페이스로 여기서는 JNDI javax.naming.directory.DirContext 인터페이스가 됩니다.
  • connection-impl-class: connection-interface 구현인 org.jboss.chap7.ex1.ra.FSDirContext를 제공하는 클래스.
  • transaction-support: 트랜잭션 지원 수준으로 여기서는 NoTransaction으로 정의되어 있습니다. NoTransaction은 어떠한 트랜잭션 작업도 하지 않는 파일 시스템 리소스 아답터를 의미합니다.

ra.xml 서술자의 요소들에 대한 완전한 세부사항은 JCA 1.0 스펙이나 Sharma, Stearns 그리고 Ng 가 함께 쓴 책인 J2EE Connector Architecture and Enterprise Application Integration을 읽어보시기 바랍니다.

RAR 클래스들과 배치 서술자에서는 하나의 리소스 아답터만을 정의합니다. 리소스 아답터를 사용하려면 JBoss 어플리케이션 서버쪽으로 통합시켜야만 합니다. 이미 앞에서도 언급하였듯이 이러한 작업은 연결 팩토리 MBeans를 사용합니다. 어플리케이션 서버를 위한 JCA 서비스 설정에 대한 간단한 서술자 포맷은 7.3.2 절, “범용 JCA 아답터 설정하기”에 제시되어 있습니다. 예제 7.2, “notxfs-ds.xml 리소스 아답터 MBeans 서비스 서술자.”notxfs-ds.xml 서술자를 보여주고 있으며 다음과 같은 사항들이 적용되어 있습니다.

  • jndi-name 요소는 연결 팩토리가 JNDI쪽의 어느곳에 연결될지를 지정하는데 사용됩니다. 여기서는 java:/NoTransFS가 됩니다.
  • adapter-display-name 요소에서는 ra.xmldisplay-name 요소와 동일한 값을 지정합니다. 이것은 JCA 계층이 연결 팩토리 설정이 된 RAR가 어떻게 관련되어있는지 알 수 있게 하는 부분입니다.
  • ManagedConnectionFactoryProperties는 리소스 아답터 연결 팩토리의 기본설정에서 벗어나는 설정을 가능하게 하는 config-property 요소를 사용하여 지정될 수 있습니다. 여기서는 타입 java.lang.String 속성의 FileSystemRootDir/tmp/db/fs_store이 설정되어있습니다.

JBoss 서버쪽에 RAR의 배치와 연결 관리자 설정을 위해서는 다음과 같이 실행시키십시오:

[nr@toki examples]$ ant -Dchap=chap7 config
Buildfile: build.xml
...
config:
     [copy] Copying 1 file to /tmp/jboss-3.2.6/server/default/deploy
     [copy] Copying 1 file to /tmp/jboss-3.2.6/server/default/deploy
 
BUILD SUCCESSFUL

서버 콘솔에는 리소스 아답터가 배치되었음을 알려주는 로그 결과가 보여질 것입니다.

이제 우리는 J2EE 컴포넌트를 사용하여 이 리소스 아답터로의 접근 테스트를 할 차례가 되었습니다. 이를 위해서 우리는 echo라는 단일 메쏘드 호출을 갖는 간단한 비상태 세션 빈을 만들겠습니다. echo 메쏘드안에는 EJB가 리소스 아답터 연결 팩토리에 접근하여 연결을 생성한 후 곧바로 연결을 닫도록 되어 있습니다. echo 메쏘드 코드는 예제 7.3, “리소스 아답터 연결 팩토리에 접근하는 것을 보여주는 비상태 세션 빈의 echo 메쏘드.”에서 볼 수 있습니다.

예제 7.3. 리소스 아답터 연결 팩토리에 접근하는 것을 보여주는 비상태 세션 빈의 echo 메쏘드

public String echo(String arg)
{
    log.debug("echo, arg="+arg);
    try {
        InitialContext iniCtx = new InitialContext();
        Context enc = (Context) iniCtx.lookup("java:comp/env");
        Object ref = enc.lookup("ra/DirContextFactory");
        log.debug("echo, ra/DirContextFactory="+ref);

        DirContextFactory dcf = (DirContextFactory) ref;
        log.debug("echo, found dcf="+dcf);
        DirContext dc = dcf.getConnection();
        log.debug("echo, lookup dc="+dc);
        
        dc.close();
    } catch(NamingException e) {
        log.error("Failed during JNDI access", e);
    }
    return arg;
}

EJB는 리소스 아답터로 액세스하기 위해 CCI 인터페이스를 사용하지 않습니다. 이보다는 연결 객체로써 하나의 JNDI DirContext 객체를 반환하는 소유자의 DirContextFactory 인터페이스에 기반한 리소스 아답터에 특정한 API를 사용합니다. 예제 EJB는 시스템 계약 계층을 간단히 실행시켜 리소스 아답터 연결 팩토리를 찾은 후, 리소스에 연결을 생성하고 곧바로 연결을 닫습니다. EJB에서는 연결에 대한 실제적인 작업을 수행하는 것은 없이 비-트랜잭션 리소스이기 때문에 그냥 리소스 아답터 구현의 실행만 시키게 됩니다.

예제 디렉터리에서 다음과 같은 Ant 명령을 통해 EchoBean.echo 메쏘드를 호출하는 테스트 클라이언트를 실행하십시오:

[nr@toki examples]$ ant -Dchap=chap7 -Dex=1 run-example
Buildfile: build.xml
...
run-example1:
     [copy] Copying 1 file to /tmp/jboss-3.2.6/server/default/deploy
     [echo] Waiting for deploy...
     [java] Created Echo
     [java] Echo.echo('Hello') = Hello

BUILD SUCCESSFUL

이제 아답터와 JBoss JCA 계층간에서 발생되는 상호작용의 이해를 돕기위해 리소스 아답터에서 기록되어진 로그를 살펴보도록 하겠습니다. 로그는 JBoss 서버 배포판의 server/default/log/server.log 파일에 있습니다. 우리는 시퀀스 다이어그램을 사용하여 로그내에 보여지는 이벤트들을 요약하겠습니다.

어플리케이션 서버 컴포넌트들에서 리소스 아답터 연결 팩토리를 사용가능하도록 하는 단계에 포함된 것들을 표현하였습니다. 남아있는 로그 메시지들은 EchoBean.echo 메쏘드를 예제 클라이언트에서 호출하여 생긴것이며, 이 메쏘드는 리소스 아답터 연결 팩토리와 상호작용되어진 것입니다. 그림 7.5, “EchoBean이 리소스 아답터 연결 팩토리에 액세스함으로써 JBossCX 프레임워크와 예제 리소스 아답터사이에서 일어난 결과로부터 중요한 상호작용들을 보여주는 시퀀스 다이어그램. ”EchoBean이 JNDI로부터 리소스 아답터 연결 팩토리에 액세스하여 연결을 만들때 일어난 이벤트들을 요약한 시퀀스 다이어그램입니다.

EchoBean이 리소스 아답터 연결 팩토리에 액세스함으로써 JBossCX 프레임워크와 예제 리소스 아답터사이에서 일어난 결과로부터 중요한 상호작용들을 보여주는 시퀀스 다이어그램.

그림 7.5. EchoBean이 리소스 아답터 연결 팩토리에 액세스함으로써
JBossCX 프레임워크와 예제 리소스 아답터사이에서 일어난 결과로부터 중요한 상호작용들을 보여주는 시퀀스 다이어그램.

시작점은 클라이언트의 EchoBean.echo 메쏘드 호출입니다. 다이어그램의 이해도를 높이기위해, 클라이언트가 EchoBean 메쏘드를 직접 호출하는 것으로 표현했지만 실제로는 EJB 컨테이너가 호출을 처리합니다. EchoBean 과 리소스 아답터사이에는 3개의 분리된 작용이 존재합니다; 연결 팩토리 룩업(lookup), 연결 생성 그리고 연결 닫기.

리소스 아답터 연결 팩토리의 룩업은 이벤트의 1.1 시퀀스에 기술되어집니다. 이벤트들은 다음과 같습니다:

  • 1, echo 메쏘드는 java:/NoTransFS 위치로 연결되는 java:comp/env/ra/DirContextFactory 이름에 대한 JNDI 룩업으로부터 얻어진 리소스 아답터 연결 팩토리에 대한 getConnection 메쏘드를 호출합니다.
  • 1.1, DirContextFactoryImpl 클래스는 자신과 연결된 ConnectionManager에게 연결을 할당해달라는 요청을 합니다. 연결이 구성되는 동안 DirContextFactoryImpl에 관련되어진 ManagedConnectionFactoryFSRequestInfo 로 요청이 넘어갑니다.
  • 1.1.1, ConnectionManager는 현재의 SubjectFSRequestInfo를 갖고 자신의 getManagedConnection 메쏘드를 호출합니다.
  • 1.1.1.1, ConnectionManager는 연결 객체를 위한 자신의 객체 풀을 요청합니다. JBossManagedConnectionPool$BasePool이 연결을 위한 키를 얻은 후 연결을 위해 일치하는 InternalPool을 요청합니다.
  • 1.1.1.1.1, 어떠한 연결도 만들어지지 않았기 때문에 풀에서는 새로운 연결을 만들어야만 합니다. 이 작업은 ManagedConnectionFactory로부터 새로운 관리되는 연결의 요청을 통해 이루어집니다. FSRequestInfo 데이터뿐만 아니라 풀에 연계된 Subject까지 createManagedConnection 메쏘드 호출의 인수로 넘겨집니다.
  • 1.1.1.1.1.1, FSManagedConnectionFactory는 새로운 FSManagedConnection 인스턴스를 만들고 SubjectFSRequestInfo 데이터를 넘겨줍니다.
  • 1.1.1.2, 하나의 javax.resource.spi.ConnectionListener 인스턴스가 만들어집니다. 생성된 리스터의 타입은 ConnectionManager의 타입에 따라 달라집니다. 이 경우에는 org.jboss.resource.connectionmgr.BaseConnectionManager2$NoTransactionListener 인스턴스가 만들어집니다.
  • 1.1.1.2.1, 리스너(listener)는 1.2.1.1 에서 만들어진 ManagedConnection 인스턴스를 갖는 javax.resource.spi.ConnectionEventListener로 등록됩니다.
  • 1.1.2, ManagedConnection이 우선하는(underlying) 리소스 관리자 연결을 요청합니다. getConnection 메쏘드 호출쪽으로 SubjectFSRequestInfo 데이터가 인수로 넘겨집니다.
  • 얻어진 연결 객체는 리소스 아답터에서 퍼블릭 인터페이스로 정의되었기 때문에 javax.naming.directory.DirContext 인스턴스에 맡겨(cast)집니다.
  • EchoBean이 리소스 아답터를 위한 DirContext를 획득하면, 간단히 연결을 닫아서 리소스 관리자와의 상호작용을 완료했다고 알려주게 됩니다.

이렇게 해서 리소스 아답터 예제를 마무리하였습니다. JBossCX 계층과 간단한 리소스 아답터사이에서 일어나는 상호작용에 대한 우리의 조사과정을 통해 여러분은 임의의 리소스 아답터 설정에 필요한 단계에 대한 충분한 이해에 도움이 될 것입니다. 또한 예제 아답터는 비-JDBC 리소스들을 JBoss 서버 환경쪽으로 통합할 필요가 생길때 여러분만의 커스텀 리소스 아답터를 만드는 시작점으로 이용될 수 있습니다.

7.3. JCA 아답터 설정하기

JCA 리소스 아답터들에 대한 환경설정은 앞의 절에서 살펴본대로 JBoss JCA 서비스에서 JCA 리소스 아답터를 설정해줌으로써 가능해지게 됩니다. JBoss 3.2에서는 많은 중복된 설정 정보를 지정해야만 하던 방법을 피할 수 있는 대체가능한 간편화된 스키마가 제공됩니다.

7.3.1. JDBC 데이터소스 설정하기

JCA JDBC 연결 팩토리 설정을 위한 문법은 3.2버전에 들어와서부터 간단해졌습니다. 앞의 섹션에서 논의되었던 MBeans에 관련된 연결 관리자 팩토리를 MBean 서비스 배치 서술자를 통해 설정하기보다는 간결해진 데이터소스 중심의 서술자를 사용합니다. 이것은 jboss-jca.sar 배치에 포함되어 있는 org.jboss.deployment.XSLSubDeployer에 의해 적용된 XSL 변형(transform)을 사용하여 표준 jboss-service.xml MBean 서비스 배치 서술자를 변형시킵니다. 간단해진 환경설정 서술자는 다른 배치가능한 컴포넌트들과 동일하게 배치도어 집니다. 서술자는 XSLSubDeployer에 의해 인식되어질 수 있도록 *-ds.xml 패턴을 사용하여 명명되어야 합니다.

*-ds.xml 환경설정 배치 파일의 최상위 데이터소스 요소들을 위한 스키마는 그림 7.6, “간단해진 JCA 데이터소스 환경설정 배치자의 최상위 레벨 스키마 요소들”에 보여지고 있습니다.

간단해진 JCA 데이터소스 환경설정 배치자의 최상위 레벨 스키마 요소들

그림 7.6. 간단해진 JCA 데이터소스 환경설정 배치자의 최상위 레벨 스키마 요소들

여러 데이터소스 설정은 환경설정 배치 파일내에서 지정될 수 있습니다. 데이터소스 root의 자식 요소들은 다음과 같습니다:

  • mbean: 변환을 통해 얻어지는 jboss-service.xml 서술자내에 포함되어야만 하는 MBean 서비스들이 정의될 수 있는 MBean 요소들의 갯수 제한은 없습니다. 이것은 데이터소스에서 사용하는 서비스를 설정할 때 사용되어집니다.
  • no-tx-datasource: 이 요소는 NoTxConnectionManager(org.jboss.resource.connectionmanager) 서비스 환경설정을 지정하는데 사용됩니다. NoTxConnectionManager는 트랜잭션을 지원하지 않는 JCA 연결 관리자입니다. no-tx-datasource 자식 요소 스키마가 그림 7.7, “비-트랜잭션 데이터소스 환경설정 스키마”에 주어졌습니다.
  • local-tx-datasource: 이 요소는 LocalTxConnectionManager(org.jboss.resource.connectionmanager) 서비스 환경설정을 지정하는데 사용됩니다. LocalTxConnectionManager는 트랜잭션 관리자를 통해 트랜잭션을 관리하는 XAResource를 구현하는 ConnectionEventListener를 구현합니다. 동일한 ManagedConnection을 통해 일어나는 로컬 트랜잭션내의 모든 작업들을 보장하기위해, ManagedConnection 맵에 xid를 포함시킵니다. Connection이 요청되어지거나 이미 사용중인 커넥션 핸들과 함께 시작될 때, 전역(global) 트랜잭션내에 포함된 ManagedConnection이 이미 존재하는가를 살펴보고, 존재한다면 이것을 사용합니다. 그렇치않다면, 자유로운 ManagedConnection은 자신의 시작된 LocalTransaction 을 갖고 이를 사용합니다. local-tx-datasource 자식 요소 스키마가 그림 7.8, “비-XA 데이터소스 환경설정 스키마”에 보여지고 있습니다.
  • xa-datasource: 이 요소는 XATxConnectionManager(org.jboss.resource.connectionmanager) 서비스 환경설정을 지정하는데 사용됩니다. XATxConnectionManager는 아답터인 ManagedConnection으로부터 트랜잭션 관리자를 통해 트랜잭션을 관리하는 XAResource를 획득하는 ConnectionEventListener 를 구현합니다. 같은 ManagedConnection을 통해 발생하는 로컬 트랜잭션내의 모든 작업들을 보장하기위해, ManagedConnection 맵에 xid가 포함됩니다. Connection이 요청되어지거나 트랜잭션이 이미 사용중인 커넥션 핸들과 함께 시작될 때, 전역 트랜잭션내에 포함된 ManagedConnection이 이미 존재하는가를 살펴보고, 존재한다면 이것을 사용합니다. 그렇치않다면, 자유로운 ManagedConnection은 자신의 시작된 LocalTransaction 을 갖고 이를 사용합니다. xa-datasource 자식 요소 스키마가 그림 7.9, “XADataSource 환경설정 스키마”에 보여지고 있습니다.
비-트랜잭션 데이터소스 환경설정 스키마

그림 7.7. 비-트랜잭션 데이터소스 환경설정 스키마

The non-XA DataSource configuration schema

그림 7.8. 비-XA 데이터소스 환경설정 스키마

The XADataSource configuration schema

그림 7.9. XADataSource 환경설정 스키마

모든 데이터소스에 공통으로 포함되어 있는 요소들은 다음과 같습니다:

  • jndi-name: DataSource 랩퍼(wrapper) 아랫쪽에서 JNDI 이름이 연결되어집니다. 이 이름은 java:/ 접두어에 상대적이라는 것에 주의하십시오. DataSource의 완전한 JNDI 이름은 java:/ + jndi-이름 이 됩니다. DataSource 랩퍼는 서버 VM 외부에서는 사용가능하지 않기때문에 java:/ 접두사 아랫쪽으로 연결됩니다.
  • application-managed-security: 이 요소를 지정함으로써 getConnection(user, pw)와 같은 파라메터들을 제공받은 어플리케이션 코드가 풀내에서 식별되는 커넥션을 사용하도록 가르킵니다.
  • security-domain: 이 요소를 지정함으로써 파라메터들을 제공받는 어플리케이션 코드나 정보에 기초를 둔 JAAS Subject중에 하나가 풀내에서 커넥션을 구별할 수 있도록 가르킵니다. security-domain의 컨텐츠는 인증을 처리하게되는 JAAS 보안 관리자의 이름입니다. 이 이름은 JAAS login-config.xml 서술자의 application-policy/name 속성과 관련이 있습니다.
  • min-pool-size: 이 요소에서는 하나의 풀이 유지해야만 하는 커넥션의 최소 갯수를 지정합니다. 이 풀 인스턴스들은 커넥션 연결을 구성하기위한 초기 요청이 있기전까지는 생성되지 않습니다. 기본값은 0 입니다.
  • max-pool-size: 이 요소에서는 하나의 풀이 갖는 최대 커넥션 갯수를 지정합니다. 하나의 풀내에 생성되는 커넥션의 갯수는 max-pool-size를 넘지 않습니다. 기본값은 20입니다.
  • blocking-timeout-millis: 이 요소에는 예외상황을 발생시키기전 커넥션을 대기하는 동안 블럭킹되는 최대 시간(밀리세컨드)을 지정합니다. 여기서의 블럭킹은 연결을 허용하기위해 대기하는 동안에만 이루어지며, 새로운 커넥션을 발생하는데 비정상적으로 오래 걸리게되면 예외가 발생되지 않습니다. 기본값은 5000 입니다.
  • idle-timeout-minutes: 이 요소에는 커넥션이 닫히기전까지 휴지되는 최대 시간(분단위)을 지정합니다. 또한 실제 상황에서의 최대 시간은 IdleRemover 스캔 시간에 따라 달라지게 되며, 스캔 시간은 풀중에 가장 작은 idle-timeout-minutes 값의 1/2이 됩니다.
  • depends: depends 요소에는 커넥션 관리자 서비스에 종속된 서비스의 JMX ObjectName 문자열을 지정합니다. 커넥션 관리자 서비스는 종속된 서비스들이 시작되기 전까지는 시작되지 않습니다.

no-tx-datasource 와 local-tx-datasource 모두에 포함된 추가적인 범용 자식 요소들은 다음과 같습니다:

  • connection-url: JDBC 드라이버의 커넥션 URL 문자열입니다. 즉, jdbc:hsqldb:hsql://localhost:1701.
  • driver-class: JDBC 드라이버 클래스의 완전한 형태를 갖춘 이름입니다. 즉, org.hsqldb.jdbcDriver.
  • connection-property: connection-property 요소는 여러분들이 임의의 연결 속성들을 java.sql.Driver.connect(url, props) 메쏘드에 넘겨줄 수 있도록 합니다. 각각의 connection-property 요소에는 name 속성으로부터 속성의 이름과 element 컨텐츠의 값을 갖는 이름/값 쌍의 문자열이 지정됩니다.
  • user-name: 이 요소에는 새로운 커넥션을 생성할때 사용되는 기본 사용자이름을 지정합니다. 실제 사용자이름은 어플리케이션 코드의 getConnection 파라메터나 커넥션 생성 컨텍스트 JAAS Subject에 의해 다시 설정될 수도 있습니다.
  • password: 이 요소에는 새로운 커넥션 생성시 사용되는 기본 암호를 지정합니다. 실제 암호는 어플리케이션 코드의 getConnection 파라메터나 커넥션 생성 컨텍스트 JAAS Subject에 의해 다시 설정될 수도 있습니다.

local-tx-datasource 와 xa-datasource 모두에 공통적으로 포함된 요소들에는 다음과 같은 것들이 있습니다:

  • transaction-isolation: 이 요소에는 사용할 java.sql.Connection 트랜잭션 분리(isolation) 레벨을 지정합니다. 커넥션 인터페이스내에 정의된 상수들은 가능한 요소 컨텐츠 값과 다음을 갖습니다:
    • TRANSACTION_READ_UNCOMMITTED
    • TRANSACTION_READ_COMMITTED
    • TRANSACTION_REPEATABLE_READ
    • TRANSACTION_SERIALIZABLE
    • TRANSACTION_NONE
  • new-connection-sql: 새로운 커넥션이 생성될 때 실행되어야만 하는 SQL 문장입니다. 이것은 연결 속성을 통해 설정되지 않는 데이터에 특정한 설정값들을 갖는 연결 설정에 사용될 수 있습니다.
  • check-valid-connection-sql: 커넥션이 정당한지를 점검하기 위해 풀로부터 반환되기전에 커넥션상에서 실행되어야만 하는 SQL 문장입니다. 이를 통해 기간이 지난(stale) 풀 커넥션들을 검출할 수 있습니다. "select count(*) from x"과 같은 SQL 문장이 사용될 수 있습니다.
  • exception-sorter-class-name: 커넥션 에러 이벤트가 생성되어져야만 하는지를 필터링하는 SQLException 필터를 위한 org.jboss.resource.adapter.jdbc.ExceptionSorter 인터페이스를 구현하는 클래스를 지정합니다. 현재 구현 클래스에는 다음이 포함되어 있습니다:
    • org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
    • org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter
  • valid-connection-checker-class-name: 커넥션이 올바른가를 테스트하기 위해 풀에서 반환되어진 커넥션과 함께 호출되어지는 SQLException isValidConnection(Connection e) 메쏘드를 제공하기위한 org.jboss.resource.adapter.jdbc.ValidConnectionChecker 인터페이스를 구현하는 클래스를 지정합니다. 이것이 존재한다면 check-valid-connection-sql을 덮어씁니다. 현재 구현에는 다음이 포함되어 있습니다:
    • org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
  • track-statements: 이 부울린 요소에는 커넥션이 풀쪽으로 반환될 때 unclosed 문장을 점검할지를 지정해주게 됩니다. true로 설정한 경우에는 각각의 unclosed 문장에 대해 경고 메시지가 발생됩니다. 만약 log4j 카테고리 org.jboss.resource.adapter.jdbc.WrappedConnection에서 추적(trace) 레벨이 활성화되어 있다면, 커넥션 close call의 스택 추적 또한 로깅되어집니다. 이것은 실제 적용에서는 끌수있는 디버깅 기능입니다.
  • prepared-statement-cache-size: 이 요소에는 SQL 질의에 의해 키가되는 LRU 캐쉬내에서의 커넥션당 prepared statements의 갯수를 지정합니다. 여기에 0을 지정하면 캐쉬기능을 끄게됩니다.

xa-datasource 자식 요소만이 갖는 고유한 것들은 다음과 같습니다:

  • track-connection-by-tx: 이 요소에 true를 설정하면 커넥션 관리자가 커넥션 맵에 하나의 xid를 유지하도록 하고 트랜잭션이 종료되고 모든 커넥션 핸들이 닫히거나 메쏘드 call를 반환시켜 분리될 때 풀에 커넥션만을 다시 집어넣습니다. 이에 따른 추가적인 효과로써, 커넥션이 절대 일지 중지하는 현상(suspend)이 나타나지 않으며 커넥션의 XAResource에 대한 xid를 재시작합니다. 이것은 로컬 트랜잭션에서 사용되는 커넥션의 추적(tracking) 동작과 동일합니다.
    XA 스펙에서는 어떠한 커넥션도 임의의 쓰레드로부터 어느순간에라도 어떠한 트랜잭션을 위한 xid를 사용하는 트랜잭션내에(필요하다면 다른 트랜잭션을 잠시 중지시켜서) 참여할 수 있다는 것을 내포하고 있습니다. JCA 구현의 오리지날 버전에서는 이러한 사실을 가정하고 커넥션을 사용하던 EJB가 제어를 벗어나거나 핸들이 닫히는 순간 적극적으로(aggressively) 커넥션들을 목록에서 제거(delisted)하고 이것을 다시 풀로 돌려보냅니다. 몇몇 다른 트랜잭션에서 커넥션을 사용할 수 있기 때문에 다음번 작업이 원래의 트랜잭션상에서 이루어져야할 필요가 있지만, 원래의 커넥션을 다시 얻을 수 있는 방법이 없습니다. 대부분의 XADataSource 드라이버 벤더들이 이를 지원하지 못한다는 것이 밝혀졌고 동일한 커넥션을 통해 특정한 xid 하에서 모든 작업이 이루어지도록 요구됩니다.
  • xa-datasource-class: javax.sql.XADataSource 구현 클래스의 완전한 형태를 갖는 이름입니다. 즉, com.informix.jdbcx.IfxXADataSource.
  • xa-datasource-property: xa-datasource-property 요소는 XADataSource 구현 클래스에 할당시킬 속성들의 지정을 가능케 합니다. 각각의 속성들은 name 속성에 의해 식별되어지며 속성의 값은 xa-datasource-property 요소 컨텐츠에 의해 주어집니다. 속성은 속성의 이름을 위한 자바빈즈 스타일의 getter 메쏘드 검색에 의해 XADataSource 구현쪽으로 매핑됩니다. 만약 찾았다면, 속성의 값은 타입을 위한 java.beans.PropertyEditor 를 사용하여 true 속성 타입으로 변환되는 요소의 텍스트를 갖는 자바빈즈 setter를 사용하여 설정됩니다.
  • isSameRM-override-value: XA managed 커넥션상에서 javax.transaction.xa.XAResource.isSameRM(XAResource xaRes) 메쏘드 동작을 덮어쓰는 것을 가능하게 하는 부울린 플래그입니다. 이 값을 지정할 경우, xaRes 파라메터의 여부와 상관없이 isSameRM(xaRes) 리턴값으로써 무조건적으로 사용됩니다.
  • no-tx-seperate-pools: 이 요소의 존재는 두개의 커넥션 풀이 JTA 트랜잭션없이 사용되는 것과 JTA 트랜잭션을 사용하는 커넥션으로 분리될 필요가 있음을 알려줍니다. 풀은 처음 사용할때는 느리게 구성되어집니다. 이것의 use case는 JTA 트랜잭션을 가진/갖지 않는 하나의 XA 커넥션을 사용하기를 꺼려하는 오라클(그리고 다른 벤더도 가능)의 XA 구현입니다.

7.3.2. 범용 JCA 아답터 설정하기

XSLSubDeployer는 대체가능한 축약된 문법을 사용하여 임의의 비-JDBC JCA 리소스 아답터들의 배치까지도 지원합니다. *-ds.xml 환경설정 배치 파일의 상위-레벨 커넥션 팩토리 요소들에 대한 스키마가 그림 7.10, “간단해진 JCA 아답터 커넥션 팩토리 환경설정 서술자의 상위-레벨 스키마 요소들”에 보여지고 있습니다.

간단해진 JCA 아답터 커넥션 팩토리 환경설정 서술자의 상위-레벨 스키마 요소들

그림 7.10. 간단해진 JCA 아답터 커넥션 팩토리 환경설정 서술자의 상위-레벨 스키마 요소들

여러개의 커넥션 팩토리 설정들이 하나의 환경설정 배치 파일내에 지정될 수 있습니다. connection-factories 루트의 자식 요소들은 다음과 같습니다:

  • mbean: 어떠한 번호를 갖는 mbean 요소들이라도 변형(transformation)의 결과인 jboss-service.xml 서술자내에 포함되어져야만 하는 MBean 서비스들을 정의하기위해 지정될 수 있습니다. 이것은 아답터에서 사용되는 서비스들을 설정하는데 이용됩니다.
  • no-tx-connection-factory: 이 요소는 NoTxConnectionManager(org.jboss.resource.connectionmanager) 서비스 환경설정을 지정하는데 사용됩니다. NoTxConnectionManager는 트랜잭션을 지원하지 않는 JCA 커넥션 관리자입니다. no-tx-connection-factory 자식 요소의 스키마는 그림 7.11, “no-tx-connection-factory 요소 스키마” 에서 살펴볼 수 있습니다.
  • tx-connection-factory: 이 요소는 TxConnectionManager(org.jboss.resource.connectionmanager) 서비스 환경설정을 지정하는데 사용됩니다. tx-connection-factory 자식 요소의 스키마는 그림 7.12, “tx-connection-factory 요소 스키마” 에서 살펴볼 수 있습니다.
no-tx-connection-factory 요소 스키마

그림 7.11. no-tx-connection-factory 요소 스키마

tx-connection-factory 요소 스키마

그림 7.12. tx-connection-factory 요소 스키마

요소들의 대부분은 데이터소스 환경설정에서의 요소들과 동일합니다. 커넥션 팩토리 환경설정의 고유한 요소들은 다음과 같습니다:

  • adaptor-display-name: 커넥션 관리자 MBean을 할당하기위한 사람이 읽을 수 있는 표시 이름.
  • config-property: ManagedConnectionFactory (MCF) MBean 서비스 설정에 제공하기 위한 속성들의 임의의 갯수. 각각의 config-property 요소에서는 하나의 MCF 속성 값을 지정합니다. config-property 요소는 두개의 필요한 속성을 갖습니다:
    • name: 속성의 이름
    • type: 속성의 완전한 형태를 갖는 타입
  • config-property 요소의 컨텐츠는 속성 값의 표현을 위한 문자열을 제공합니다. 이것은 관련된 PropertyEditor 타입을 사용하여 true 속성 타입으로 변환되어집니다.
  • local-transaction | xa-transaction: 이 요소들에서는 tx-connection-factory가 로컬 트랜잭션 혹은 XA 트랜잭션을 지원할지를 지정합니다.

7.3.3. 환경설정 샘플

많은 써드-파티 JDBC 드라이버의 예제 환경설정은 JBOSS_DIST/docs/examples/jca 디렉터리안에 있습니다. 현재 예제 환경설정에 포함된 것들은 다음과 같습니다:

  • asapxcess-jb3.2-ds.xml
  • cicsr9s-service.xml
  • db2-ds.xml
  • db2-xa-ds.xml
  • facets-ds.xml
  • fast-objects-jboss32-ds.xml
  • firebird-ds.xml
  • firstsql-ds.xml
  • firstsql-xa-ds.xml
  • generic-ds.xml
  • hsqldb-ds.xml
  • informix-ds.xml
  • informix-xa-ds.xml
  • jdatastore-ds.xml
  • jms-ds.xml
  • jsql-ds.xml
  • lido-versant-service.xml
  • mimer-ds.xml
  • mimer-xa-ds.xml
  • msaccess-ds.xml
  • mssql-ds.xml
  • mssql-xa-ds.xml
  • mysql-ds.xml
  • oracle-ds.xml
  • oracle-xa-ds.xml
  • postgres-ds.xml
  • sapdb-ds.xml
  • sapr3-ds.xml
  • solid-ds.xml
  • sybase-ds.xml