21.2. 配置CCI

21.2.1. 连接器配置

使用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事务。

21.2.2. 在Spring中配置ConnectionFactory

为了创建到 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规范的一部分。

21.2.3. 配置CCI连接

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>

21.2.4. 使用一个 CCI 单连接

如果你想使用一个 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注入一个带有ConnectionSpecConnectionSpecConnectionFactoryAdapter适配器。