このドキュメントでは、コネクタ・ベースのMDB (JMSベースのMDB)機能を使用して、インフロー・トランザクションの構成、デプロイメントを行う方法について説明します。また、プログラミングに関する内容も一部取り上げます。この機能を使用すると、Oracle TuxedoからJavaアプリケーション・サーバーへのインフロー(インバウンド)トランザクションが可能になります。この付録の内容は次のとおりです。
詳細は、『Tuxedo JCA Adapterプログラミング・ガイド』および『Tuxedo JCA Adapterユーザーズ・ガイド』を参照してください。
インフロー・トランザクション機能は、 RARファイルとして配布されます。jarファイルを解凍し、Oracle Tuxedo JCA Adapter (Tuxedo JCA Adapter)構成をアプリケーション・サーバーにインストールする前に構成を変更する必要があります。
表1は、サポートされるOracle Tuxedoとアプリケーション・サーバーのバージョンのリストです。
RARファイル名は、com.oracle.tuxedo.TuxedoAdapter.rar
です。Tuxedo JCA Adapter構成を変更した後、(任意の名前を使用して)構成をアーカイブ化し、Tuxedo JCA Adapterをアプリケーション・サーバーに構成できます。
表2は、RARファイルのコンテンツのリストです。
Tuxedo JCA Adapterは、トランザクションなどのOracle Tuxedo TDOMAINプロトコルをサポートしています。図1を参照してください。Tuxedo JCA Adapterは、Oracle Tuxedoからインバウンド・リクエストを受信し、関連するOracle Tuxedoトランザクション・コンテキストがあるかどうかチェックします。トランザクション・コンテキストがある場合、Tuxedo JCA Adapterは、Oracle Tuxedoトランザクション・コンテキストに基づきjavax.transaction.xa.Xid
を作成します。
Tuxedo JCA Adapterは、このXIDをExecutionContextに設定し、実行するためにExecutionContextとともにWorkインスタンスをアプリケーション・サーバーWorkManagerに送信します。インポートしたトランザクションをこの手順でJavaアプリケーション・サーバーに伝播すると、アプリケーション・サーバーと後続の参加者はインポートしたトランザクションの一部として機能できます。
注意: | JCA 1.5準拠のアプリケーション・サーバーではExecutionContextを使用しますが、JCA 1.6準拠のアプリケーション・サーバーではTransactionContextを使用します。 |
「エクスポートした」サービスとは、Oracle Tuxedoクライアントからアクセス可能なJavaリソースです。つまりこの場合はコネクタ・ベースのMDBになります。Javaアプリケーション・サーバーにあるリソースにOracle Tuxedoクライアントがアクセスできるよう、「Export」要素をdmconfig
ファイルに構成する必要があります。
dmconfig
ファイル内の1つの「Export」要素は、Oracle Tuxedoクライアントにエクスポートしたリソースを参照します。 リスト1は、Oracle Tuxedoクライアントにエクスポートした2つのサービス(Tolower
とEcho
)を示しています。RemoteName
は、Oracle Tuxedo GWTDOMAINゲートウェイによってサービスが呼び出される場合に使用されるサービス名です。name
属性はリソースのサービス名です。Type
はインフロー・トランザクション用MDBにする必要があり、Source
はMDBのJNDIバインディングです。
…
<Export name=”Tolower”>
<RemoteName>TolowerMDB</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/Tolower</Source>
</Export>
<Export name=”Echo”>
<RemoteName>EchoMDB</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/Echo</Source>
</Export>
…
1つのMDBを使用してエクスポートされた複数のサービスもサポートされます。これには、アダプタ・アプリケーション開発者の自由度を向上する目的があります。dmconfigファイルのSource
要素で指定したJNDI名と同一の名前を使用して複数のサービスを構成できます。ただし、当該MDBにはアプリケーションによって実装されたインタフェースが1つしかないため、アプリケーションが独自にディスパッチを実行する必要があります。 リスト2は、1つのMDBを使用してエクスポートされた複数のサービスの例を示しています。
…
<Export name=”INFO_SERVICE”>
<RemoteName>INFO</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/services</Source>
</Export>
<Export name=”ACCOUNT_SERVICE”>
<RemoteName>ACCOUNT</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/services</Source>
</Export>
…
この例では、JNDI名eis/services
にバインドする同一のMDBを使用して、Oracle Tuxedoクライアントに2つのサービス(INFO
とACCOUNT
)をエクスポートします。ここでは、MDBに渡したサービス名を使用してディスパッチするMDBを1つ構成してデプロイする必要があります。 リスト3は、独自にディスパッチを実行するMDBサンプル・コード・フラグメントを示しています。
…
public Reply service(TPServiceInformation mydata)
throws TuxedoReplyException
{
String serviceName = mydata.getServiceName();
if (serviceName.equals(“ACCOUNT_SERVICE”)) {
doAccount1(mydata);
}
else if (serviceName.equals(“INFO_SERVICE”)) {
doInfo(mydata);
}
else {
/* throws an exception */
}
}
リスト4は、Tuxedo JCA Adapter構成ファイルの詳細な例を示しています。
<?xml version="1.0" encoding="UTF-8"?><TuxedoConnector>
<LocalAccessPoint name="JDOM">
<AccessPointId>JDOM_ID</AccessPointId>
<NetworkAddress>//localhost:10801</NetworkAddress>
</LocalAccessPoint>
<RemoteAccessPoint name="TDOM1">
<AccessPointId>TDOM1_ID</AccessPointId>
<NetworkAddress>//localhost:12478</NetworkAddress>
</RemoteAccessPoint>
<SessionProfile name="profile_1">
<BlockTime>60000</BlockTime>
<ConnectionPolicy>ON_STARTUP</ConnectionPolicy>
</SessionProfile>
<Session name="session_1">
<LocalAccessPointName>JDOM</LocalAccessPointName>
<RemoteAccessPointName>TDOM1</RemoteAccessPointName>
<ProfileName>profile_1</ProfileName>
</Session>
<Export name="Tolower">
<RemoteName>TolowerMDB</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/tolower</Source>
</Export>
<Export name="Echo">
<RemoteName>EchoMDB</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/echo</Source>
</Export>
<Export name="INFO_SERVICE">
<RemoteName>INFO</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/services</Source>
</Export>
<Export name="ACCOUNT_SERVICE">
<RemoteName>ACCOUNT</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/services</Source>
</Export>
</TuxedoConnector>
複数のMDBを使用してエクスポートされた複数のサービスもサポートされます。dmconfigの「source」要素で指定された同一のJNDI名を使用して構成できます。Tuxedo JCA Adapterは「source」要素の値に基づいてディスパッチします。リスト5に、dmconfig
ファイルの構成例を示します。
…
<Export name="SERVICE_1">
<RemoteName>TJA_SERVICE_1</RemoteName>
<Type>MDB</Type>
<Source>eis/service</Source>
</Export>
</Export name="SERVICE_2">
<RemoteName>TJA_SERVICE_2</RemoteName>
<Type>MDB</Type>
<Source>eis/service</Source>
</Export>
<Export name="INFO">
<RemoteName>TJA_INFO</RemoteName>
<Type>MDB</Type>
<Source>eis/info</Source>
</Export>
</TuxedoConnector>
前述の例では、次の2つのMDBを構成してデプロイする必要があります。
1つ目のMDBはSERVICE_1
とSERVICE_2
を内部でディスパッチする必要があります。
リソース・アダプタ・デプロイメント記述子(ra.xml
)を構成する必要があります。ra.xml
という名前は変更できません。すべてのRARファイルは、1つのra.xml
ファイルを格納する必要があります。MDBを使用してインフロー・トランザクションを機能させるには、inbound-resourceadapter
要素を構成する必要があります。この要素は、Tuxedo JCA Adapter専用のインタフェースとアクティブ化仕様を記述するために使用されます。
inbound-resourceadapter
要素を修正します。構成可能なプロパティは、source
プロパティのみです。構成済の場合、JCAコンテナには、EJB記述子(ejb-jar.xml)
ファイルで指定されるsource
プロパティが必要になります。
リスト6は、ra.xml
ファイルの例を示しています。ベースとしてTuxedo JCA Adapterとともに配布されるra.xmlファイルを使用して、必要に応じてカスタマイズできます。
<?xml version="1.0" encoding="UTF-8"?>
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<display-name>Tuxedo JCA Adapter</display-name>
<vendor-name>Oracle</vendor-name>
<eis-type>Tuxedo</eis-type>
<resourceadapter-version>12c(12.1.1)</resourceadapter-version>
<license>
<description>Tuxedo SALT license</description>
<license-required>false</license-required>
</license>
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</resourceadapter-class>
<!--
The following is the list of properties name can be configured as adapter-wise configuration.
traceLevel - java.lang.String - a numerical value
xaAffinity - java.lang.String - transaction affinity to a remote domain, "true" or "false", default to true
keyFileName - java.lang.String - encryption key file name
throwFailureReplyException - java.lang.Boolean - default to ture
appManagedLocalTxTimeout - java.lang.Integer - Application managed transaction or AUTOTRAN timeout
defaults to 300 seconds
fieldTable16Class - java.lang.String - a comma-separated list of fully qualified FML classes
fieldTable32class - java.lang.String - a comma-separated list of fully qualified FML32 classes
viewFile16Class - java.lang.String - a comma-separated list of fully qualified VIEW classes
viewFile32Class - java.lang.String - a comma-separated list of fully qualified VIEW32 classes
tpusrFile - java.lang.String - path name to the TPUSR file
remoteMBEncoding - java.lang.String - remote Tuxedo encoding name for multi-byte language
mBEncodingMapFile - java.lang.String - path name to Multi-byte encoding name mapping
autoTran - java.lang.Boolean- enable adapter-wise AUTOTRAN, default to false
-->
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoManagedConnectionFactory</managedconnectionfactory-class>
<!--
The following is the list of properties that you can use
to configure thee connection pool or connection factory.
You must either configure localAccessPointSpec or
connectionFactoryName if transaction is used.
These property described here is serving as template, user should not
configure them here, instead user should configure them either through WebSphere console
or weblogic-ra.xml side file.
-->
<config-property>
<description>factory-wise AUTOTRAN setting, default to false, overrides adapter-wise setting</description>
<config-property-name>autoTran</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise Failure Reply Exception setting, default to true, overrides adapter-wise setting</description>
<config-property-name>throwFailureReplyException</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application managed transaction or AUTOTRAN time out, overrides adapter-wise setting</description>
<config-property-name>appManagedLocalTxTimeout</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>connection factory or pool name, this is required if XA or local application managed
transaction is required</description>
<config-property-name>connectionFactoryName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>application password in either clear text or cipher text using com.oracle.tuxedo.tools.EncryptPassword tool</description>
<config-property-name>applicationPassword</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>local access point specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>localAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL to configure whether mutual authentication is required, default to false</description>
<config-property-name>mutualAuthenticationRequired</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL for configuring identity key store file name, must be configured if SSL is desired</description>
<config-property-name>identityKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL setting for private key alias used in the key store, must be configured if SSL is desired</description>
<config-property-name>privateKeyAlias</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise trusted key store file name, must be configured if SSL is desired</description>
<config-property-name>trustedKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for identityKeyStore in clear text</description>
<config-property-name>identityKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for privateKeyAlias in clear text</description>
<config-property-name>privateKeyAliasPassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for trustedKeyStore in clear text</description>
<config-property-name>trustedKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise RemoteAccessPoint specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>remoteAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise allow anonymous access to Tuxedo, default to false</description>
<config-property-name>rapAllowAnonymous</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key value for anonymous user, default to -1</description>
<config-property-name>rapDefaultApplicationKey</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key fully qualified class name for AppKey generator</description>
<config-property-name>rapApplicationKeyClass</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise custom application key parameter</description>
<config-property-name>rapApplicationKeyClassParam</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise session profile block timeout value, default to 60000 milliseconds</description>
<config-property-name>spBlockTime</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise whether allows interoperate with 6.5 Tuxedo Domain, default to false</description>
<config-property-name>spInteroperate</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise security setting, legal values: NONE, DM_PW, APP_PW</description>
<config-property-name>spSecurity</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise credential propagation policy, either LOCAL or GLOBAL</description>
<config-property-name>spCredentialPolicy</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise number of seconds that session waits between automatic connection establishment,
default to 60 seconds. A value of 0 disabled connection retry</description>
<config-property-name>spRetryInterval</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum number of times adapter will try to establish a session connection to
remote Tuxedo access point. Default value is Long.MAX_VALUE.</description>
<config-property-name>spMaxRetries</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise compression threshold, default to Integer.MAX_VALUE</description>
<config-property-name>spCompressionLimit</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise minimum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 0.</description>
<config-property-name>spMinEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 128.</description>
<config-property-name>spMaxEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise the maximum idle time before sending application level keep alive.
It is measured in millisecond, and roundup to seconds. Default value is 0.</description>
<config-property-name>spKeepAlive</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise how long adapter will wait for acknowledgement before adapter decides the
connection already lost. Measurement in millisecond, and its default value is 10 seconds.
A value of 0 will disable the wait, and thus will not close the connection</description>
<config-property-name>spKeepAliveWait</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise valid Tuxedo service names in a comma-separated list. If not specified then
default import will be used and will grant all service request to remote Tuxedo domain</description>
<config-property-name>impResourceName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>Exported resource, types of resource supported are EJB, POJO, MDB.</description>
<config-property-name>exportSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.resource.cci.Connection</connection-interface>
<connection-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoJCAConnection</connection-impl-class>
</connection-definition>
<!--
<transaction-support>NoTransaction</transaction-support>
<transaction-support>LocalTransaction</transaction-support>
-->
<transaction-support>XATransaction</transaction-support>
<authentication-mechanism>
<authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
<credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
</authentication-mechanism>
<reauthentication-support>false</reauthentication-support>
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>com.oracle.tuxedo.adapter.intf.TuxedoMDBService</messagelistener-type>
<activationspec>
<activationspec-class>com.oracle.tuxedo.adapter.spi.TuxedoActivationSpec</activationspec-class>
<required-config-property>
<config-property-name>source</config-property-name>
</required-config-property>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
</resourceadapter>
</connector>
inbound-resourceadapter要素には、コネクタ・ベースのMDBで実装する必要があるインタフェース・クラスとアクティブ化仕様クラスが含まれます。
完全修飾インタフェース名は、com.oracle.tuxedo.adapter.intf.TuxedoMDBService
です。完全修飾アクティブ化仕様は、com.oracle.tuxedo.adapter.spi.TuxedoActivationSpec
です。Tuxedo JCA Adapter ra.xml
ファイルでこれらの2つの値のいずれも変更しないでください。
Tuxedo JCA Adapterは実行時に、構成されたJava Beanプロパティ、ResourceAdapterおよびActivationSpec内部的に統合して使用し、インバウンド通信の構成とします。
アプリケーション・ベースのディスパッチを使用する方法では、ActivationSpec
Java Beanプロパティを構成する必要はありません。アダプタ・ベースのディスパッチの場合は、リソース・アダプタ・デプロイメント記述子に、必須の構成プロパティ「source」を指定する必要があります。
次の構成フラグメントは、リソース・アダプタ・デプロイメント記述子(ra.xml
)の一部です。Oracle Tuxedo JCA Connectorがインバウンド・サービス・リクエストを受け入れられるように構成されています。
<connector...>
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapterImpl
</resourceadapter-class>
...
<outbound-resourceadapter>
…
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>
com.oracle.tuxedo.adapter.intf.TuxedoMDBService
</messagelistener-type>
<activationspec>
<activationspec-class>
com.oracle.tuxedo.adapter.spi.TuxedoActivationSpec
<activationspec-class>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
...
</resourceadapter>
</connector>
前述のリソース・アダプタ・デプロイメント記述子は、TuxedoMDBServiceインタフェースに基づく単一のMDBを実装、デプロイし、そのMDB内のサービス名を使用してディスパッチを実行するユーザーにのみ適しています。
次のリソース・アダプタ・デプロイメント記述子フラグメントは、Tuxedo JCA AdapterがインバウンドMDBサービス・リクエストを送信するのに適切な構成を示しています。
<connector...>
...
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapterImpl
</resourceadapter-class>
...
<outbound-resourceadapter>
…
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>
com.oracle.tuxedo.adapter.intf.TuxedoMDBService
</messagelistener-type>
<activationspec>
<activationspec-class>
com.oracle.tuxedo.adapter.spi.TuxedoActivationSpec
<activationspec-class>
<required-config-property>
<config-property-name>source</config-property-name>
</required-config-property>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
...
</resourceadapter>
</connector>
非JMSベースのMDBと通常のEJBを区別するために、「Export
」を型「MDB」で構成する必要があります。アプリケーション・ベースのディスパッチの場合、「Source
」と「SourceLocation
」は不要なため、省略できます(指定しても無視されます)。
リスト9に、アプリケーション・ベースのディスパッチのdmcomfigの例を示します。
…
<Export name="TOLOWER">
<RemoteName>TJA_TOLOWER</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
</Export>
…
次に、Tuxedo JCA Adapterベースのディスパッチを有効にして、使用する例を示します。
…
<Export name="TOLOWER">
<RemoteName>TJA_TOLOWER</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/tolower</Source>
</Export>
…
この「Source」要素にはターゲットのMDBのJNDI名を記述します(Tuxedo JCA Adapterがインバウンド・サービス・リクエストをディスパッチするために必要)。
ファクトリ・ベースの構成を使用して、インバウンド・サービス・リクエストで非JMSベースのMDBをサポートするために、新しいプロパティ「exportSpec」が追加されました。リスト11に、「exportSpec
」の再帰下降文法の定義を示します。
exportSpec ::= expResources | EMPTY
expResources ::= resource [resources]
resources ::= ';' resource [resources]
resource ::= resourceName [resourceDesc]
resourceDesc ::= '(' attrDescs ')'
attrDescs ::= attrDesc ':' attrDescs
attrDesc ::= attrName '=' [resourceName|resourceNameList]
resourceNameList ::= resourceName [resourceNames]
resourceNames ::= ',' resourceName [resourceNames]
resourceName ::= alphabet [alphanumeric]
attrName ::= "remoteName" | "remoteAccessPointList" |
"type" | "source" | "sourceLocation"
alphabet ::= "a"-"z" "A"-"Z"
alphanumeric ::= {alphabet | numeric} [alphanumeric]
numeric ::= "0"-"9"
リスト12に、ファクトリ・ベースの構成例を示します。
<properties>
…
<property>
<name>exportSpec</name>
<value>TOLOWER(remoteName=TJA_TOLOWER:type=MDB)</value>
</property>
…
</properties>
このタイプの構成はWebSphereではサポートされていません。WebLogic ServerとJBossでは、アウトバウンド・リソース・アダプタも構成される必要があります。
注意: | WebSphereの遅延バインディング手法のため、ファクトリ・ベースの構成が機能するのは、TuxedoからインバウンドMDBリクエストがある前に接続ファクトリ参照があった場合のみです。 |
リスト13に、MDBのJNDI名を構成するファクトリ・ベースの別の構成例を示します。
<properties>
…
<property>
<name>exportSpec</name>
<value>TOLOWER(remoteName=TJA_TOLOWER:type=MDB:source=eis/tolower)</value>
</property>
…
</properties
Tuxedo JCA Adapterで提供されるEJB MDBインタフェースは、非JMSベースのMDBで実装する必要があります。MDBインタフェースは、Tuxedo JCA Adapterによってサポートされる既存のEJBと類似していますが、同じではありません。
リスト14に、MDNインタフェースの例を示します。
package com.oracle.tuxedo.adapter.intf;
import weblogic.wtc.jatmi.Reply;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
public interface TuxedoMDBService {
public Reply service(TPServiceInformation service) throws TuxedoReplyException;
}
注意: | これはJMSベースのMDBと異なり、「onMessage」インタフェースでなく「service」インタフェースを持っています。 |
リスト15に、EJB 3.0仕様に基づいてこのインタフェースを実装するMDBコードの例を示します。
@MessageDriven(name = "TolowerMDB", activationConfig =
{
@ActivationConfigProperty(propertyName="source", propertyValue="eis/tolower")
})
@TransactionAttribute(SUPPORTS)
public class TolowerMDBBean implements TuxedoMDBService
{
public Reply service(TPServiceInformation mydata)
throws TuxedoReplyException
{
TypedString data;
String lowered;
TypedString return_data;
String serviceName = mydata.getServiceName();
data = (TypedString)mydata.getServiceData();
lowered = data.toString().toLowerCase();
return_data = new TypedString(lowered);
mydata.setReplyBuffer(return_data);
return mydata;`
}
}
リスト16に、まったく同じ内容をEJB 2.1で実装した場合の例を示します。
package ejbs;
import com.oracle.tuxedo.adapter.TuxedoReplyException;
import com.oracle.tuxedo.adapter.intf.TuxedoMDBService;
import com.oracle.tuxedo.adapter.tdom.TPServiceInformation;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TypedString;
public class TolowerMDBBeanBean
implements MessageDrivenBean, TuxedoMDBService
{
public TolowerMDBBeanBean()
{
}
public MessageDrivenContext getMessageDrivenContext()
{
return fMessageDrivenCtx;
}
public void setMessageDrivenContext(MessageDrivenContext ctx)
{
fMessageDrivenCtx = ctx;
}
public void ejbCreate()
{
}
public void onMessage(Message message)
{
}
public void ejbRemove()
{
}
public Reply service(TPServiceInformation mydata)
throws TuxedoReplyException
{
TypedString data = (TypedString)mydata.getServiceData();
String lowered = data.toString().toLowerCase();
TypedString return_data = new TypedString(lowered);
mydata.setReplyBuffer(return_data);
return mydata;
}
private static final long serialVersionUID = 1L;
private MessageDrivenContext fMessageDrivenCtx;
}
Tuxedo JCA Adapterと通信するには、Oracle Tuxedo GWTDOMAINゲートウェイを構成する必要もあります。リスト17に、Oracle Tuxedo /Domain構成ファイルの例を示します。
#
*DM_RESOURCES
#
VERSION=U22
#
#
#
*DM_LOCAL_DOMAINS
#
# NOTE: Remove DYNAMIC_RAP line if you are not running with Tuxedo 11.1.1.2.0
#
"TDOM1" GWGRP=GROUP3
TYPE=TDOMAIN
DOMAINID="TDOM1_ID"
BLOCKTIME=60
SECURITY=NONE
DMTLOGDEV="C:\test\JCA\inflow_tx/tdom/DMTLOG"
DYNAMIC_RAP="YES"
#
*DM_REMOTE_DOMAINS
#
#
JDOM TYPE=TDOMAIN
DOMAINID="JDOM_ID"
#
#
*DM_TDOMAIN
#
TDOM1 NWADDR="//localhost:12478"
JDOM NWADDR="//localhost:10801"
#
#
*DM_LOCAL_SERVICES
#
#Exported
#
#
*DM_REMOTE_SERVICES
#
#Imported
#
TolowerMDB
EchoMDB
INFO
ACCOUNT
この例では、Oracle TuxedoはTolowerMDB
、EchoMDB
、INFO
、およびACCOUNT
サービスをインポートします。一方、Tuxedo JCA Adapterはこれらをエクスポートします。
WebSphere Integrated Solution Consoleで、https://localhost:9047/ibm/console/logon.jsp (ここで9047は、アプリケーション・サーバーのリスニングするポート番号)を入力します。
WebSphereアプリケーション・サーバーにTuxedo JCA Adapterをデプロイする前に、dmconfig
構成ファイルを作成する必要があります。リスト18は、dmconfig
ファイルの例を示しています。
<?xml version="1.0" encoding="UTF-8"?><TuxedoConnector>
<LocalAccessPoint name="JDOM">
<AccessPointId>JDOM_ID</AccessPointId>
<NetworkAddress>//localhost:10801</NetworkAddress>
</LocalAccessPoint>
<RemoteAccessPoint name="TDOM1">
<AccessPointId>TDOM1_ID</AccessPointId>
<NetworkAddress>//localhost:12478</NetworkAddress>
</RemoteAccessPoint>
<SessionProfile name="profile_1">
<BlockTime>60000</BlockTime>
<ConnectionPolicy>ON_STARTUP</ConnectionPolicy>
</SessionProfile>
<Session name="session_1">
<LocalAccessPointName>JDOM</LocalAccessPointName>
<RemoteAccessPointName>TDOM1</RemoteAccessPointName>
<ProfileName>profile_1</ProfileName>
</Session>
<Export name="ECHOMDB">
<RemoteName>ECHO</RemoteName>
<SessionName>session_1</SessionName>
<Type>MDB</Type>
<Source>eis/echo</Source>
</Export>
</TuxedoConnector>
リソース・アダプタ・デプロイメント記述子は、ゼロから作成することも既存のものを変更することもできます。 リスト8は、デプロイメント記述子の例を示しています。
<?xml version="1.0" encoding="UTF-8"?>
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<display-name>Tuxedo JCA Adapter</display-name>
<vendor-name>Oracle</vendor-name>
<eis-type>Tuxedo</eis-type>
<resourceadapter-version>12c(12.1.1)</resourceadapter-version>
<license>
<description>Tuxedo SALT license</description>
<license-required>false</license-required>
</license>
<resourceadapter>
<resourceadapter-class>com.oracle.tuxedo.adapter.TuxedoResourceAdapter</resourceadapter-class>
<!--
The following is the list of properties name can be configured as adapter-wise configuration.
traceLevel - java.lang.String - a numerical value
xaAffinity - java.lang.String - transaction affinity to a remote domain, "true" or "false", default to true
keyFileName - java.lang.String - encryption key file name
throwFailureReplyException - java.lang.Boolean - default to ture
appManagedLocalTxTimeout - java.lang.Integer - Application managed transaction or AUTOTRAN timeout
defaults to 300 seconds
fieldTable16Class - java.lang.String - a comma-separated list of fully qualified FML classes
fieldTable32class - java.lang.String - a comma-separated list of fully qualified FML32 classes
viewFile16Class - java.lang.String - a comma-separated list of fully qualified VIEW classes
viewFile32Class - java.lang.String - a comma-separated list of fully qualified VIEW32 classes
tpusrFile - java.lang.String - path name to the TPUSR file
remoteMBEncoding - java.lang.String - remote Tuxedo encoding name for multi-byte language
mBEncodingMapFile - java.lang.String - path name to Multi-byte encoding name mapping
autoTran - java.lang.Boolean- enable adapter-wise AUTOTRAN, default to false
-->
<config-property>
<config-property-name>traceLevel</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>2000000</config-property-value>
</config-property>
<!--
<config-property>
<config-property-name>xaAffinity</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
-->
<config-property>
<config-property-name>dmconfig</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>C:\test\JCA\inflow_tx/adapter/dmconfig.xml</config-property-value>
</config-property>
<config-property>
<config-property-name>keyFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>C:\test\JCA\inflow_tx/adapter/foo.key</config-property-value>
</config-property>
<config-property>
<config-property-name>debugAdapter</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugJatmi</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugConfig</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugSession</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugXa</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugPdu</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<config-property>
<config-property-name>debugSec</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
<config-property-value>true</config-property-value>
</config-property>
<!--
-->
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>com.oracle.tuxedo.adapter.spi.TuxedoManagedConnectionFactory</managedconnectionfactory-class>
<!--
The following is the list of properties that you can use to
to configure connection pool or connection factory.
User must either configure localAccessPointSpec or
connectionFactoryName if transaction is used.
These property described here is serving as template, user should not
configure them here, instead user should configure them either through WebSphere console
or weblogic-ra.xml side file.
-->
<config-property>
<description>factory-wise AUTOTRAN setting, default to false, overrides adapter-wise setting</description>
<config-property-name>autoTran</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise Failure Reply Exception setting, default to true, overrides adapter-wise setting</description>
<config-property-name>throwFailureReplyException</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application managed transaction or AUTOTRAN time out, overrides adapter-wise setting</description>
<config-property-name>appManagedLocalTxTimeout</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>connection factory or pool name, this is required if XA or local application managed
transaction is required</description>
<config-property-name>connectionFactoryName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>application password in either clear text or cipher text using com.oracle.tuxedo.tools.EncryptPassword tool</description>
<config-property-name>applicationPassword</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>local access point specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>localAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL to configure whether mutual authentication is required, default to false</description>
<config-property-name>mutualAuthenticationRequired</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL for configuring identity key store file name, must be configured if SSL is desired</description>
<config-property-name>identityKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise SSL setting for private key alias used in the key store, must be configured if SSL is desired</description>
<config-property-name>privateKeyAlias</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise trusted key store file name, must be configured if SSL is desired</description>
<config-property-name>trustedKeyStoreFileName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for identityKeyStore in clear text</description>
<config-property-name>identityKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for privateKeyAlias in clear text</description>
<config-property-name>privateKeyAliasPassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise password for trustedKeyStore in clear text</description>
<config-property-name>trustedKeyStorePassPhrase</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise RemoteAccessPoint specification of the format //hostname:port/domainId=DOMAINID</description>
<config-property-name>remoteAccessPointSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise allow anonymous access to Tuxedo, default to false</description>
<config-property-name>rapAllowAnonymous</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key value for anonymous user, default to -1</description>
<config-property-name>rapDefaultApplicationKey</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise application key fully qualified class name for AppKey generator</description>
<config-property-name>rapApplicationKeyClass</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise custom application key parameter</description>
<config-property-name>rapApplicationKeyClassParam</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise session profile block timeout value, default to 60000 milliseconds</description>
<config-property-name>spBlockTime</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise whether allows interoperate with 6.5 Tuxedo Domain, default to false</description>
<config-property-name>spInteroperate</config-property-name>
<config-property-type>java.lang.Boolean</config-property-type>
</config-property>
<config-property>
<description>factory-wise security setting, legal values: NONE, DM_PW, APP_PW</description>
<config-property-name>spSecurity</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise credential propagation policy, either LOCAL or GLOBAL</description>
<config-property-name>spCredentialPolicy</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise number of seconds that session waits between automatic connection establishment,
default to 60 seconds. A value of 0 disabled connection retry</description>
<config-property-name>spRetryInterval</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum number of times adapter will try to establish a session connection to
remote Tuxedo access point. Default value is Long.MAX_VALUE.</description>
<config-property-name>spMaxRetries</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise compression threshold, default to Integer.MAX_VALUE</description>
<config-property-name>spCompressionLimit</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
</config-property>
<config-property>
<description>factory-wise minimum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 0.</description>
<config-property-name>spMinEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise maximum encryption strength requirement, legal values are 0, 40, 56, 128, 256.
Default value is 128.</description>
<config-property-name>spMaxEncryptBits</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>factory-wise the maximum idle time before sending application level keep alive.
It is measured in millisecond, and roundup to seconds. Default value is 0.</description>
<config-property-name>spKeepAlive</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise how long adapter will wait for acknowledgement before adapter decides the
connection already lost. Measurement in millisecond, and its default value is 10 seconds.
A value of 0 will disable the wait, and thus will not close the connection</description>
<config-property-name>spKeepAliveWait</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
</config-property>
<config-property>
<description>factory-wise valid Tuxedo service names in a comma-separated list. If not specified then
default import will be used and will grant all service request to remote Tuxedo domain</description>
<config-property-name>impResourceName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<config-property>
<description>Exported resources. Types of resource supported are</description>
<config-property-name>exportSpec</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
<connectionfactory-interface>javax.resource.cci.ConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.resource.cci.Connection</connection-interface>
<connection-impl-class>com.oracle.tuxedo.adapter.cci.TuxedoJCAConnection</connection-impl-class>
</connection-definition>
<!--
<transaction-support>NoTransaction</transaction-support>
<transaction-support>LocalTransaction</transaction-support>
-->
<transaction-support>XATransaction</transaction-support>
<authentication-mechanism>
<authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
<credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
</authentication-mechanism>
<reauthentication-support>false</reauthentication-support>
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>com.oracle.tuxedo.adapter.intf.TuxedoMDBService</messagelistener-type>
<activationspec>
<activationspec-class>com.oracle.tuxedo.adapter.spi.TuxedoActivationSpec</activationspec-class>
<required-config-property>
<config-property-name>source</config-property-name>
</required-config-property>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
</resourceadapter>
</connector>
デプロイメント記述子を使用してリソース・アダプタをJARファイル化してリソース・アーカイブを作成した後、これをWebSphereアプリケーション・サーバーにデプロイできます。
WebSphere Integrated Solution Consoleにログインした後、左ウィンドウ・ペインから「リソース」を選択します。図2に示すように、「リソース・アダプタ」を選択します。「リソース・アダプタ」ウィンドウが表示されます。「参照」をクリックし、RARファイルを検索します。
「次へ」をクリックすると、図3に示すように、「一般プロパティ」ページが表示されます。「説明」テキスト入力ボックスに適切な説明を入力します。
「リソース・アダプタ」 > Tuxedo JCA Adapterから、「Additional Properties」のJ2Cアクティブ化仕様を選択すると、図4で示すように「J2Cアクティブ化仕様」ページが表示されます。「新規」を選択し、アクティブ化仕様名とそのJNDI名を入力します(この例では、仕様名をEchoMDB
、JNDI名をeis/echo
とします)。このJNDI名は、EchoMDB
というJNDI名を使用します。
WebSphereアプリケーション・サーバーを起動し、Integrated Solution Consoleを使用してWebSphereにログインします。通常、コンソール・ポート番号は904X (「X」は任意の数字)です。
注意: | logs/server1/SystemOut.log を検索できます。 TCPチャンネルTCP_3はリスニングしているという旨の「TCP Channel TCP_3 is listening. 」を確認します。 |
コンソールの左ペインで「環境」を選択すると、サブメニュー付きメニュー・アイテムが展開されます。共有ライブラリを選択すると、共有ライブラリ画面が表示されます。
「新規」をクリックすると、構成画面が表示されます。「名前」に任意の名前を入力します。この例では、「名前」テキスト入力ボックスにEchoMDBEnvと入力します。「クラスパス」ウィンドウで、次の2つのJARファイルのフルパス名を入力します。
区切りには[Enter]キーを押し、「保存」をクリックします。
コンソールの左ペインで、「アプリケーション」、新しいアプリケーションのインストールの順に選択します。「エンタープライズ・アプリケーション」メニューが表示されます。
新しいアプリケーションへのパスでローカル・ファイル・システムを選択します。「参照」をクリックし、「EchoMDB.jar」
ファイルを選択します。
アプリケーションのインストール方法で、すべてのインストール・オプションとパラメータの表示を選択します。「次へ」をクリックすると、図5で示すように「インストール・オプションの選択」ページが表示されます。エンタープライズBeanのデプロイを選択し、「次へ」をクリックします。
「手順2: サーバーにモジュールをマッピングする」で、Echo MDBを使用するサーバーを選択します。EchoMDBにチェック・マークを入れ、「適用」をクリックします。「次へ」をクリックします。
「手順3: メッセージドリブンBeanのリスナーをバインドする」で、図7で示すようにアクティブ化仕様を選択し、このMDBのJNDI名を入力します(この場合、eis/echo
を入力します)。
「次へ」をクリックすると、図8に示すように、「サマリー」ページが表示されます。「終了」をクリックします。アプリケーション・サーバーがMDBをコンパイルしてデプロイします。
コンソールの左ペインで、「アプリケーション」を選択してから「エンタープライズ・アプリケーション」を選択します。EchoMDB.jarを選択し、「起動」をクリックします。Echo” EJBがアクティブ化されます。
リスト63に、この例で使用されるOracle Tuxedo UBBCONFIGファイルを示します。
#
#Ubbconfig domain1
#
*RESOURCES
IPCKEY 51301
MASTER site1
MAXACCESSERS 100
MAXSERVERS 25
MAXSERVICES 50
MODEL SHM
LDBAL N
BLOCKTIME 1
SCANUNIT 5
SECURITY NONE
*MACHINES
DEFAULT:
APPDIR="C:\test\JCA\inflow_tx/tdom1"
TUXCONFIG="C:\test\JCA\inflow_tx/tdom1/TUXCONFIG"
TUXDIR="c:\tuxedo\tux11g"
"NEOCORTEX" LMID=site1
MAXWSCLIENTS=2
*GROUPS
GROUP3 LMID=site1 GRPNO=3 OPENINFO=NONE
GROUP2 LMID=site1 GRPNO=2 OPENINFO=NONE
GROUP1 LMID=site1 GRPNO=1 TMSNAME=TMS TMSCOUNT=3
#GROUP1 LMID=site1 GRPNO=1
*SERVERS
DEFAULT:
CLOPT="-A" RESTART=Y MAXGEN=5
DMADM SRVGRP=GROUP2 SRVID=1
GWADM SRVGRP=GROUP3 SRVID=2
GWTDOMAIN SRVGRP=GROUP3 SRVID=3
ENVFILE="C:\test\JCA\inflow_tx/tdom1/gwt.env"
simpserv SRVGRP=GROUP1 SRVID=20
*SERVICES
TOUPPER_STR
リスト64に、i/Domainの構成例を示します。
#
*DM_RESOURCES
#
VERSION=U22
#
#
*DM_LOCAL_DOMAINS
#
# NOTE: Remove DYNAMIC_RAP line if you are not running with Tuxedo 11.1.1.2.0
#
"TDOM1" GWGRP=GROUP3
TYPE=TDOMAIN
DOMAINID="TDOM1_ID"
BLOCKTIME=60
SECURITY=NONE
DMTLOGDEV="C:\test\JCA\inflow_tx/tdom1/DMTLOG"
DYNAMIC_RAP="YES"
#
*DM_REMOTE_DOMAINS
#
#
JDOM TYPE=TDOMAIN
DOMAINID="JDOM_ID"
#
#
*DM_TDOMAIN
#
TDOM1 NWADDR="//localhost:12478"
JDOM NWADDR="//localhost:10801"
#
#
*DM_LOCAL_SERVICES
#
#Exported
#
TOUPPER_STR
#
*DM_REMOTE_SERVICES
#
#Imported
#
ECHO
リスト65に、WebSphereアプリケーション・サーバーからインポートされたECHO
サービスにアクセスするシンプルなOracle Tuxedoネイティブ・クライアントを示します。
#include <stdio.h>
#include “atmi.h”
main(int argc, char *argv[])
{
char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
int ret;
if (tpinit((TPINIT *)NULL) == -1) {
(void)fprintf(stderr, “Tpinit failed\n”);
exit(1);
}
sendlen = strlen(argv[1]);
if ((sendbuf = (char *)tpalloc(“STRING”, NULL, sendlen + 1)) == NULL) {
(void)fprintf(stderr, “Error allocating send buffer\n”);
tpterm();
exit(2);
}
if ((rcvbuf = (char *)tpalloc(“STRING”, NULL, sendlen + 1)) == NULL) {
(void)fprintf(stderr, “Error allocating receive buffer\n”);
tpfree(sendbuf);
tpterm();
exit(2);
}
(void)strcpy(sendbuf, argv[2]);
tpbegin(45, 0);
ret = tpcall(“ECHO”, (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
if (ret == -1) {
tpabort(0);
tpfree(sendbuf);
tpfree(recvbuf);
tpterm();
exit(1);
}
userlog(“Return string: %s”, rcvbuf);
tpcommit(0);
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
return(0);
}