?
? ????? PHP ??? ???? ??? ?? ??
使用JCA CCI的基礎(chǔ)資源是 ConnectionFactory
接口。
所用的連接器必須提供這個接口的一個實現(xiàn)。
為了使用連接器,可以把它部署到你的應(yīng)用服務(wù)器上,并從服務(wù)器的JNDI環(huán)境(托管模式)取回 ConnectionFactory
。
連接器必須打包為一個RAR文件(resource adapte archive)并包含一個部署描述符文件 ra.xml
。
部署時需要指定資源的實際名字。如果想通過Spring訪問它,只要簡單地使用Spring的 JndiObjectFactoryBean
來通過JNDI名字獲取工廠。
使用連接器的另一種方法是把它嵌入到應(yīng)用程序中(非托管模式(non-managed mode)),而不用在應(yīng)用服務(wù)器中部署并配置它。
Spring提供了通過已提供的 FactoryBean
(LocalConnectionFactoryBean
))來將連接器配置成一個bean的可能。
在這種方式中,只需要把連接器類庫放到classpath目錄下(不需要RAR文件和 ra.xml
描述符)。
如果有必要的話,必須從連接器的RAR文件解壓得到那個類庫。
一旦訪問 ConnectionFactory
實例,
就可以將它注入到組件。這些組件既可以用簡單的CCI API編碼,也可以利用Spring支持CCI訪問的類(比如,CciTemplate
)。
當在非托管模式(non-managed mode)下使用連接器時,將無法使用全局事務(wù), 因為該資源從不會被加入或刪除到當前線程的當前全局事務(wù)中。該資源根本不知道任何可能正在運行的全局的J2EE事務(wù)。
為了創(chuàng)建到 EIS 的連接,如果處于托管模式(managed mode),你需要從應(yīng)用服務(wù)器獲取一個 ConnectionFactory
,
或者當你在非托管模式(non-managed mode)時直接從Spring去獲取。
在托管模式(managed mode)下,你可以從JNDI訪問 ConnectionFactory
,
它的屬性將被配置在應(yīng)用服務(wù)器中。
<bean id="eciConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="eis/cicseci"/> </bean>
在非托管模式(non-managed mode)下,你必須在Spring配置中將你要用的 ConnectionFactory
配置為一個JavaBean。
LocalConnectionFactoryBean
類提供這種配置風格,把 ManagedConnectionFactory
傳入到你的連接器的實現(xiàn)中,
暴露應(yīng)用級的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
接口。
你需要為連接器實現(xiàn)相應(yīng)的 ManagedConnectionFactory
接口,這個接口是JCA SPI規(guī)范的一部分。
JCA CCI允許開發(fā)者使用自己的連接器的 ConnectionSpec
接口實現(xiàn)來配置到 EIS 的連接。
為了配置該連接的屬性,需要用一個指定的 ConnectionSpecConnectionFactoryAdapter
適配器來封裝目標連接工廠。
因此,特定的 ConnectionSpec
接口可以用 connectionSpec
屬性來配置(作為一個內(nèi)部bean)。
這個屬性不是必需的,因為CCI ConnectionFactory
接口定義了兩個不同的方法來獲取 CCI 連接。
ConnectionSpec
的一些屬性常??梢员慌渲迷趹?yīng)用服務(wù)器中(托管模式(managed mode))
或相關(guān)的本地 ManagedConnectionFactory
實現(xiàn)。
public interface ConnectionFactory implements Serializable, Referenceable { ... Connection getConnection() throws ResourceException; Connection getConnection(ConnectionSpec connectionSpec) throws ResourceException; ... }
Spring提供了 ConnectionSpecConnectionFactoryAdapter
適配器,
允許你指定一個 ConnectionSpec
接口的實例, 供給定工廠的所有操作使用。
如果指定了適配器的 connectionSpec
屬性,適配器就使用沒有參數(shù)的 getConnection
變量,
而不是有 ConnectionSpec
參數(shù)的變量。
<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
適配器類將延遲打開一個單獨的連接并在應(yīng)用程序銷毀這個bean的時候關(guān)閉它。
這個類將暴露出特殊 Connection
的相應(yīng)代理,并共享同一個底層的物理連接。
<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
適配器。