使用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
接口的实例, 供给定工厂的所有操作使用。
如果指定了适配器的 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
与之通信的中间 ConnectionSpecConnectionFactoryAdapter
适配器。