使用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
适配器。