使用JCA CCI的基础资源是ConnectionFactory接口。
被使用的连接器必须提供这个接口的一个实现。
为了使用你的连接器,你可以把它部署到你的应用服务器,并从服务器的JNDI环境(托管模式)取回ConnectionFactory。
连接器必须打包为一个RAR文件(resource adapte archive)并包含一个部署描述符文件ra.xml 。
当你部署时需要指定资源的实际名字。如果想通过Spring访问它,只需要简单地使用Spring的 JndiObjectFactoryBean
来通过JNDI名字获取工厂。
使用连接器的另外一个方法是把它嵌入到你的应用程序中(非托管模式(non-managed mode)),而不用在应用服务器中部署并配置它。
Spring通过已提供的FactoryBean (LocalConnectionFactoryBean)来将连接器配置为一个bean。
在这种方式中,你只需要把连接器类库放入classpath目录下(不需要RAR文件和ra.xml 描述符)。
如果有必要的话,你可以解压连接器的RAR文件来得到那个类库。
一旦你访问 ConnectionFactory 实例,
你就可以注入到你的组件中。这些组件既可以用简单的CCI API来编码也可以利用Spring提供的CCI访问类(比如, CciTemplate)。
当在非托管模式(non-managed mode)下使用连接器时,你将不能够使用全局事务, 因为该资源从不会被加入或删除到当前线程的当前全局事务中。该资源根本不知道任何可能正在运行的全局性的J2EE事务。
为了创建到 EIS 的连接,如果处于托管模式(managed mode),你需要从应用服务器获取一个 ConnectionFactory ,
或者当你在非托管模式(non-managed mode)时直接从Spring去获取。
在托管模式(managed mode)下,你可以从JNDI访问ConnectionFactory,它的属性将被配置在应用服务器中。
<bean id="eciConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="eis/cicseci"/> </bean>
在非托管模式(non-managed mode)下,你必须在Spring配置中将你要用的 ConnectionFactory 配置为一个JavaBean。
LocalConnectionFactoryBean 类提供这种配置风格,把ManagedConnectionFactory传入到你的连接器的实现中,
暴露为应用级的CCI ConnectionFactory。
<bean id="eciManagedConnectionFactory" class="com.ibm.connector2.cics.ECIManagedConnectionFactory"> <property name="serverName" value="TXSERIES"/> <property name="connectionURL" value="tcp://localhost/"/> <property name="portNumber" value="2006"/> </bean> <bean id="eciConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean"> <property name="managedConnectionFactory" ref="eciManagedConnectionFactory"/> </bean>
你不能直接实例化一个指定的 ConnectionFactory接口。
你需要为你的连接器实现相应的 ManagedConnectionFactory 接口,这个接口是JCA SPI规范的一部分。
JCA CCI允许开发者使用自己的连接器的 ConnectionSpec接口具体实现来配置到 EIS 的连接。
为了配置该连接的属性,你需要用一个指定的ConnectionSpecConnectionFactoryAdapter类型的适配器来封装目标连接工厂。
因此,特定的 ConnectionSpec 接口可以用 connectionSpec 属性来设置(作为一个内部bean)。
这个属性不是必需的,因为CCI ConnectionFactory 接口定义了两个方法来获取 CCI 连接。
ConnectionSpec 的一些属性常常被配置在应用服务器中(托管模式(managed mode))或相关的本地 ManagedConnectionFactory 实现。
public interface ConnectionFactory implements Serializable, Referenceable {
...
Connection getConnection() throws ResourceException;
Connection getConnection(ConnectionSpec connectionSpec) throws ResourceException;
...
}
Spring提供了ConnectionSpecConnectionFactoryAdapter适配器,
允许你指定一个ConnectionSpec接口的实例, 该实例可以被给定ConnectionFactory的所有操作使用。
如果指定了适配器的 connectionSpec 属性,适配器使用没有参数的 getConnection 方法,
而不是有 ConnectionSpec 参数的方法。
<bean id="managedConnectionFactory"
class="com.sun.connector.cciblackbox.CciLocalTxManagedConnectionFactory">
<property name="connectionURL" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="driverName" value="org.hsqldb.jdbcDriver"/>
</bean>
<bean id="targetConnectionFactory"
class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property name="managedConnectionFactory" ref="managedConnectionFactory"/>
</bean>
<bean id="connectionFactory"
class="org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
<property name="connectionSpec">
<bean class="com.sun.connector.cciblackbox.CciConnectionSpec">
<property name="user" value="sa"/>
<property name="password" value=""/>
</bean>
</property>
</bean>
如果你想使用一个 CCI 单连接,Spring提供一个额外的 ConnectionFactory 适配器来管理它。
SingleConnectionFactory 适配器类将延迟打开一个单独的连接并在应用程序销毁这个bean的时候关闭它。
这个类将暴露出特殊Connection接口的相应的代理,并共享同一个底层物理连接。
<bean id="eciManagedConnectionFactory"
class="com.ibm.connector2.cics.ECIManagedConnectionFactory">
<property name="serverName" value="TEST"/>
<property name="connectionURL" value="tcp://localhost/"/>
<property name="portNumber" value="2006"/>
</bean>
<bean id="targetEciConnectionFactory"
class="org.springframework.jca.support.LocalConnectionFactoryBean">
<property name="managedConnectionFactory" ref="eciManagedConnectionFactory"/>
</bean>
<bean id="eciConnectionFactory"
class="org.springframework.jca.cci.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetEciConnectionFactory"/>
</bean>
ConnectionFactory适配器不能直接被配置为带有ConnectionSpec属性.
如果你需要含有特定ConnectionSpec的单一连接,那么可以往SingleConnectionFactory注入一个带有ConnectionSpec的ConnectionSpecConnectionFactoryAdapter适配器。