一.关于Workshop Tuxedo Control(WTuxC)控件
Workshop Tuxedo Control是 BEA Weblogic Workshop8.1提供了一个控件,用于把TUXEDO服务封装成Webservices。在此之前,曾经有人试着使用WTC或JOLT去把TUXEDO服务封装成Webservices,但前提是程序必须先要掌握WTC或JOLT的配置和编程接口,Workshop Tuxedo Control对WTC作了进一步的包装,从而使TUXEDO服务封装成Webservices的过程更加简化。
二. Workshop Tuxedo Control的平台支持性
Tuxedo Control的Beta版支持WINDOWS2000操作系统
| Server Platform |
Tuxedo Version Tested |
WebLogic Platform Version |
| MS Windows 2000 |
Tuxedo 8.1 |
WebLogic Platform 8.1 Beta version |
Tuxedo Control的GA版支持如下平台:
| Server Platform |
Tuxedo Version |
WebLogic Platform Version |
| HP-UX v11i (32 bit) |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| HP-UX v11.00 (32 bit) |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| Solaris 8 (Sparc 32 bit) |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| Solaris 9 (Sparc 32 bit) |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| MS Windows 2000 |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| MS Windows XP (IDEonly) |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
| Red Hat Linux Advanced Server 2.1 |
Tuxedo 8.1, 8.0, 7.1, 6.5 |
WebLogic Platform 8.1 |
三. Workshop Tuxedo Control控件的安装
在安装WebLogic Platform 8.1的Beta版或GA版时,Tuxedo Control被安装到%BEA_HOME%\ ext_components\Tuxedo目录下,如果没有看到这个目录,可以到BEA的dev2dev站点(http://dev2dev.bea.com/code/index.jsp)上去下载TuxedoCtrl_81_beta.zip组件包来单独安装,大约3.1M。
四. Workshop Tuxedo Control的工作原理
Workshop Tuxedo Control使用WTC与TUXEDO系通信。TUXEDO系统需要配置一个域网关,本地网关访问点为TDOM1,监听//localhost:1234,Workshop domain的本地网着访问点为TDOM2,监听//localhost:5678。

五.WtuxC的使用--创建WTC
使用build.xml脚本来创建一个名为myWTC的WTC Service,build.xml脚本内容如下:
|
(Domain: workshop, AdminServer: cgServer)
<project name="simpapp" default="all" basedir=".">
<!-- set global properties for this build -->
<property environment="env"/>
<property name="myurl" value="t3://localhost:7001"/>
<target name="all" depends="init, setwtc"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
</target>
<!-- create WTCServerbean -->
<target name="setwtc">
<input message="Enter system username:" addproperty="user"/>
<input message="Enter system password:" addproperty="passwd"/>
<input message="Enter name for local access point:" addproperty="lclaccess"/>
<input message="Enter name for remote access point:" addproperty="remaccess"/>
<input message="Enter the Network Address for your local access point:" addproperty="lclnwaddr"/>
<input message="Enter the Network Address for your remote access point:" addproperty="remnwaddr"/>
<property name="mbeanargs" value="-url -username -password "/>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=MyWTC,Type=WTCServer"/>
</java>
<!--set local wls domain -->
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myLoclTuxDom,Type=WTCLocalTuxDom,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myLoclTuxDom,Type=WTCLocalTuxDom,WTCServer=MyWTC -property
AccessPoint -property AccessPointId -property NWAddr -property
ConnectionPolicy ON_DEMAND -property Security NONE"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=MyWTC,Type=WTCServer -property LocalTuxDoms workshop:Name=
myLoclTuxDom,Type=WTCLocalTuxDom,WTCServer=MyWTC"/>
</java>
<!-- set remote tuxedo domain -->
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myRTuxDom,Type=WTCRemoteTuxDom,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myRTuxDom,Type=WTCRemoteTuxDom,WTCServer=MyWTC -property
AccessPoint -property AccessPointId -property NWAddr -property
LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=MyWTC,Type=WTCServer -property RemoteTuxDoms
workshop:Name=myRTuxDom,Type=WTCRemoteTuxDom,WTCServer=MyWTC"/>
</java>
<!-- set imported resources -->
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources1,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources1,Type=WTCImport,WTCServer=MyWTC -property
ResourceName CLOSE_ACCT -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources2,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources2,Type=WTCImport,WTCServer=MyWTC -property
ResourceName DEPOSIT -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources3,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources3,Type=WTCImport,WTCServer=MyWTC -property
ResourceName INQUIRY -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources4,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources4,Type=WTCImport,WTCServer=MyWTC -property
ResourceName OPEN_ACCT -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources5,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources5,Type=WTCImport,WTCServer=MyWTC -property
ResourceName TRANSFER -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" CREATE -mbean workshop:Name=myImportedResources6,Type=WTCImport,WTCServer=MyWTC"/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=myImportedResources6,Type=WTCImport,WTCServer=MyWTC -property
ResourceName WITHDRAWAL -property RemoteAccessPointList -property LocalAccessPoint "/>
</java>
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=MyWTC,Type=WTCServer -property Imports
"workshop:Name=myImportedResources1,Type=WTCImport,WTCServer=MyWTC;workshop:Name=myImportedResources2,
Type=WTCImport,WTCServer=MyWTC;workshop:Name=myImportedResources3,Type=WTCImport,WTCServer=MyWTC;workshop:
Name=myImportedResources4,Type=WTCImport,WTCServer=MyWTC;workshop:Name=myImportedResources5,Type=WTCImport,
WTCServer=MyWTC;workshop:Name=myImportedResources6,Type=WTCImport,WTCServer=MyWTC""/>
</java>
<!-- Deploy WTCServer -->
<java classname="weblogic.Admin">
<arg line=" SET -mbean workshop:Name=MyWTC,Type=WTCServer -property Targets workshop:Name=cgServer,Type=Server"/>
</java>
</target>
</project>
|
在build.xml文件所在的目录下执行"ant setwtc"来创建myWTC,创建之前需要依次输入username, password, local access point, remote access point, Network Address for your local access point, Network Address for your remote access point,之后可以看到一系列的OK,如果抛例外,则说明创建不成功,需要重新创建。
创建完成后,可以在Weblogic Server的console中看到myWTC:

六.WtuxC的使用--创建Tuxedo域
在TUXEDO一端,使用bankapp提供后台服务,bankapp的ubb配置文件内容如下:
*RESOURCES
IPCKEY 80952
UID 0
GID 0
PERM 0660
MAXACCESSERS 1100
MAXSERVERS 100
MAXSERVICES 150
MAXCONV 10
MASTER SITE1
SCANUNIT 10
MODEL SHM
LDBAL Y
*MACHINES
JQ LMID=SITE1
TUXDIR="G:\bea\tuxedo"
APPDIR="C:\TuxDAP\solutions\wtc\tux\bankapp"
ENVFILE="C:\TuxDAP\solutions\wtc\tux\bankapp\ENVFILE"
TLOGDEVICE="C:\TuxDAP\solutions\wtc\tux\bankapp\TLOG"
TLOGNAME=TLOG
TUXCONFIG="C:\TuxDAP\solutions\wtc\tux\bankapp\tuxconfig"
ULOGPFX="C:\TuxDAP\solutions\wtc\tux\bankapp\ULOG"
MAXWSCLIENTS=1000
SICACHEENTRIESMAX=1000
#
#
*GROUPS
DMGRP LMID=SITE1 GRPNO=52 OPENINFO=NONE
LGWGRP LMID=SITE1 GRPNO=53 OPENINFO=NONE
#
# Group for Authentication Servers
#
##AUTHGRP LMID=SITE1 GRPNO=101
#
# Group for Application Queue (/Q) Servers
#
##QGRP1 LMID=SITE1 GRPNO=102
## TMSNAME=TMS_QM TMSCOUNT=2
## OPENINFO="TUXEDO/QM:<APPDIR1>/qdevice:QSP_BANKAPP"
#
# Group for Application Manager's Servers
#
##MGRGRP1 LMID=SITE1 GRPNO=103
#
# Group for Event Broker Servers
#
##EVBGRP1 LMID=SITE1 GRPNO=104
WSGRP LMID=SITE1 GRPNO=100
DEFAULT: TMSNAME=TMS_SQL TMSCOUNT=2 LMID=SITE1
BANKB1 GRPNO=1 OPENINFO="TUXEDO/SQL:C:\TuxDAP\devices\bankdl1;bankdb;readwrite"
BANKB2 GRPNO=2 OPENINFO="TUXEDO/SQL:C:\TuxDAP\devices\bankdl2;bankdb;readwrite"
BANKB3 GRPNO=3 OPENINFO="TUXEDO/SQL:C:\TuxDAP\devices\bankdl3;bankdb;readwrite"
#
#
*SERVERS
DMADM SRVGRP=DMGRP SRVID=10
GWADM SRVGRP=LGWGRP SRVID=11
GWTDOMAIN SRVGRP=LGWGRP SRVID=12 REPLYQ=N
simpserv SRVGRP=WSGRP SRVID=250
#
# TUXEDO System /T server providing application specific authentication.
# Ref. AUTHSVR(5).
#
##AUTHSVR SRVGRP=AUTHGRP SRVID=1 RESTART=Y GRACE=0 MAXGEN=2
## CLOPT="-A"
#
# TUXEDO System /T Message Queue Manager. It is a server that enqueues and
# dequeues messages on behalf of programs calling tpenqueue(3) and
# tpdequeue(3) respectively. Ref. TMQUEUE(5).
#
##TMQUEUE SRVGRP=QGRP1 SRVID=1 CONV=N GRACE=0
## CLOPT="-s QSP_BANKAPP:TMQUEUE"
#
# TUXEDO System /T Message Forwarding Server that forwards messages that have
# been stored using tpenqueue(3) for later processing. Ref. TMQFORWARD(5).
#
##TMQFORWARD SRVGRP=QGRP1 SRVID=2 CONV=N REPLYQ=N GRACE=0
## CLOPT="-- -e -n -d -q Q_OPENACCT_LOG"
#
# TUXEDO System /T User Event Broker that manages user events by notifying
# subscribers when those events are posted. Ref. TMUSREVT(5).
#
##TMUSREVT SRVGRP=EVBGRP1 SRVID=1 GRACE=3600
## ENVFILE="<APPDIR1>/TMUSREVT.ENV"
## CLOPT="-e tmusrevt.out -o tmusrevt.out -A --
## -f <APPDIR1>/tmusrevt.dat"
## SEQUENCE=11
#
# TUXEDO Application Server that subscribes to certain events.
#
##ACCTMGR SRVGRP=MGRGRP1 SRVID=1
## CLOPT="-A -o ACCTMGR.LOG -- -w 1000.00"
## SEQUENCE=12
DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"
TLR SRVGRP=BANKB1 SRVID=1 CLOPT="-A -- -T 100 -e 1000.00"
TLR SRVGRP=BANKB2 SRVID=2 CLOPT="-A -- -T 500 -e 1000.00"
TLR SRVGRP=BANKB3 SRVID=3 CLOPT="-A -- -T 800 -e 1000.00"
XFER SRVGRP=BANKB1 SRVID=4
XFER SRVGRP=BANKB2 SRVID=5
XFER SRVGRP=BANKB3 SRVID=6
ACCT SRVGRP=BANKB1 SRVID=7
ACCT SRVGRP=BANKB2 SRVID=8
ACCT SRVGRP=BANKB3 SRVID=9
BAL SRVGRP=BANKB1 SRVID=10
BAL SRVGRP=BANKB2 SRVID=11
BAL SRVGRP=BANKB3 SRVID=12
BTADD SRVGRP=BANKB1 SRVID=13
BTADD SRVGRP=BANKB2 SRVID=14
BTADD SRVGRP=BANKB3 SRVID=15
AUDITC SRVGRP=BANKB1 SRVID=16 CONV=Y MIN=1 MAX=10 RQADDR="auditc"
BALC SRVGRP=BANKB1 SRVID=27
BALC SRVGRP=BANKB2 SRVID=28
BALC SRVGRP=BANKB3 SRVID=29
WSL
SRVID=10
SRVGRP=WSGRP
RESTART=Y
MAXGEN=10
GRACE=3600
CLOPT="-A -- -n //JQ:7110 -m 2 -M 10 -x 5 -c 1024 -w WSH"
*SERVICES
DEFAULT: LOAD=50 AUTOTRAN=Y TRANTIME=30
WITHDRAWAL PRIO=50 ROUTING=ACCOUNT_ID
DEPOSIT PRIO=50 ROUTING=ACCOUNT_ID
TRANSFER PRIO=50 ROUTING=ACCOUNT_ID
INQUIRY PRIO=50 ROUTING=ACCOUNT_ID
CLOSE_ACCT PRIO=40 ROUTING=ACCOUNT_ID
OPEN_ACCT PRIO=40 ROUTING=BRANCH_ID
BR_ADD PRIO=20 ROUTING=BRANCH_ID
TLR_ADD PRIO=20 ROUTING=BRANCH_ID
ABAL PRIO=30 ROUTING=b_id
TBAL PRIO=30 ROUTING=b_id
ABAL_BID PRIO=30 ROUTING=b_id
TBAL_BID PRIO=30 ROUTING=b_id
ABALC_BID PRIO=30 ROUTING=b_id
TBALC_BID PRIO=30 ROUTING=b_id
*ROUTING
ACCOUNT_ID FIELD=ACCOUNT_ID
BUFTYPE="FML"
RANGES="10000-49999:BANKB1,
50000-79999:BANKB2,
80000-109999:BANKB3"
BRANCH_ID FIELD=BRANCH_ID
BUFTYPE="FML"
RANGES="1-4:BANKB1,
5-7:BANKB2,
8-10:BANKB3"
b_id FIELD=b_id
BUFTYPE="VIEW:aud"
RANGES="1-4:BANKB1,
5-7:BANKB2,
8-10:BANKB3"
TUXEDO域配置文件dmconfig内容如下:
*DM_RESOURCES
VERSION=U22
*DM_LOCAL_DOMAINS
TDOM1 GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID="TDOM1"
BLOCKTIME=20
MAXDATALEN=56
MAXRDOM=89
DMTLOGDEV="C:\TuxDAP\solutions\wtc\tux\simpapp\TLOG"
AUDITLOG="C:\TuxDAP\solutions\wtc\tux\simpapp\AUD"
DMTLOGNAME="DMTLOG_TDOM1"
*DM_REMOTE_DOMAINS
TDOM2 TYPE=TDOMAIN
DOMAINID="TDOM2"
*DM_TDOMAIN
TDOM1 NWADDR="//localhost:1234"
TDOM2 NWADDR="//localhost:5678"
*DM_LOCAL_SERVICES
WITHDRAWAL
DEPOSIT
TRANSFER
INQUIRY
CLOSE_ACCT
OPEN_ACCT
*DM_REMOTE_SERVICES
启动TUXEDO域,输出结果如下:
C:\TuxDAP\solutions\wtc\tux\bankapp>tmboot -y
Booting all admin and server processes in C:\TuxDAP\solutions\wtc\tux\bankapp\tuxconfig
INFO: BEA Tuxedo, Version 8.1
INFO: Serial #: 650522264137-1013080095935, Expiration 2003-07-31, Maxusers 10000
INFO: Licensed to: BEA Evaluation Customer
Booting admin processes ...
exec BBL -A :
process id=13264 ... Started.
Booting server processes ...
exec DMADM -A :
process id=13252 ... Started.
exec GWADM -A :
process id=20568 ... Started.
exec GWTDOMAIN -A :
process id=13536 ... Started.
exec simpserv -A :
process id=12944 ... Started.
exec TMS_SQL -A :
process id=20736 ... Started.
exec TMS_SQL -A :
process id=20800 ... Started.
exec TLR -A -- -T 100 -e 1000.00 :
process id=20100 ... Started.
exec TMS_SQL -A :
process id=18656 ... Started.
exec TMS_SQL -A :
process id=3968 ... Started.
exec TLR -A -- -T 500 -e 1000.00 :
process id=4356 ... Started.
exec TMS_SQL -A :
process id=4348 ... Started.
exec TMS_SQL -A :
process id=4304 ... Started.
exec TLR -A -- -T 800 -e 1000.00 :
process id=4324 ... Started.
exec XFER -A :
process id=4308 ... Started.
exec XFER -A :
process id=4300 ... Started.
exec XFER -A :
process id=10068 ... Started.
exec ACCT -A :
process id=10076 ... Started.
exec ACCT -A :
process id=10084 ... Started.
exec ACCT -A :
process id=10092 ... Started.
exec BAL -A :
process id=10100 ... Started.
exec BAL -A :
process id=10108 ... Started.
exec BAL -A :
process id=4156 ... Started.
exec BTADD -A :
process id=10120 ... Started.
exec BTADD -A :
process id=10128 ... Started.
exec BTADD -A :
process id=4396 ... Started.
exec AUDITC -A :
process id=4392 ... Started.
exec BALC -A :
process id=4416 ... Started.
exec BALC -A :
process id=4408 ... Started.
exec BALC -A :
process id=4404 ... Started.
exec WSL -A -- -n //JQ:7110 -m 10 -M 20 -x 5 -c 1024 -w WSH :
process id=4380 ... Started.
31 processes started.
重点检查域管理进程、域网关管理进程,域网关进程是否正确启动。
七.WtuxC的使用--创建workshop domain
使用BEA WebLogic Platform 8.1的"Configuration Wizard "创建一个workshop domain,命名为workshop,管理服务器命名为cgServer。
使用BEA WebLogic workshop创建一个"Empty Application",命名为JQ:
在Application视区中右健点击JQ下的Libraries,选择"Add Library…",选择%BEA_HOME%\ext_components\Tuxedo\controls目录下面的TuxedoControl.jar,点击"打开"。如下图所示。
八.WtuxC的使用--创建Webservice
在JQ下new一个webservice project,命名为bankapp,如下图所示:

在bankapp下new一个web services,命名为bankapp.jws,
九.WtuxC的使用--创建Tuxedo Contrl
在bankapp( webservice project)下new一个Control Project,命名为TuxCtl,在TuxCtl下new一个Java Control,命名为bankapp,使它扩展Tuxedo控件,如下图所示:

为Bankctrl创建六个方法:CloseAccount, Deposit, GetBalance, OpenAccount, Transfer, Withdraw,如图所示:
BankCtrl.jcx的源代码如下:
package TuxCtl;
import com.bea.control.*;
import com.bea.tuxedo.control.TuxedoControl;
/**
* Defines a new Tuxedo control.
*
*
* :tuxedo mapping-strictness=normal
*
*/
public interface BankCtrl extends TuxedoControl, ControlExtension
{
static public class OPEN_ACCT_RETURN
{
public Integer ACCOUNT_ID;
public String SBALANCE;
}
static public class Balance
{
public String SBALANCE;
}
static public class Balances
{
public String[] SBALANCE;
}
static public class Accounts
{
public Accounts(Integer fromAccount, Integer toAccount)
{
ACCOUNT_ID = new Integer[2];
ACCOUNT_ID[0] = fromAccount;
ACCOUNT_ID[1] = toAccount;
}
public Integer[] ACCOUNT_ID;
}
/**
* OpenAccount is used to open a new account. Branch must be a value
* from 1-10, account type is either a C for checking, or S for savings.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="OPEN_ACCT"
*/
public OPEN_ACCT_RETURN OpenAccount(java.lang.String LAST_NAME, java.lang.String
FIRST_NAME, java.lang.String MID_INIT, java.lang.String SSN, java.lang.String ADDRESS,
java.lang.String PHONE, java.lang.String ACCT_TYPE, java.lang.Integer BRANCH_ID, java.lang.String SAMOUNT);
/**
* Use the CloseAccount service to close an existing account. The balance in the
* closed account is returned.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="CLOSE_ACCT"
*/
public Balance CloseAccount(Integer ACCOUNT_ID);
/**
* GetBalance returns the current balance in the account.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="INQUIRY"
*/
public Balance GetBalance(Integer ACCOUNT_ID);
/**
* Withdraw removes money from the specified account and returns the new balance.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="WITHDRAWAL"
*/
public Balance Withdraw(Integer ACCOUNT_ID, String SAMOUNT);
/**
* Deposit adds money to the specified account and returns the updated balance.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="DEPOSIT"
*/
public Balance Deposit(Integer ACCOUNT_ID, String SAMOUNT);
/**
* Transfer moves money from one account to another. The Accounts class contains
* the two account IDs, the first one being the account to transfer the money from
* and the second being the account to receive the money. The service returns a two
* element array containing the new balances of the accounts.
*
* :tuxedo field-tables="TuxCtl.bankflds" buffer-type="fml"
* service-type="service" service-name="TRANSFER"
*/
public Balances Transfer(Accounts accounts, String SAMOUNT);
}
bankflds.java是BankCtrl使用到的字段描述类,它对应于TUXEDO系统中的FML字段描述文件,其内容如下:
package controls;
import java.io.*;
import java.lang.*;
import java.util.*;
import weblogic.wtc.jatmi.*;
public final class bankflds
implements weblogic.wtc.jatmi.FldTbl
{
Hashtable nametofieldHashTable;
Hashtable fieldtonameHashTable;
/** number: 110 type: long */
public final static int ACCOUNT_ID = 8302;
/** number: 112 type: char */
public final static int ACCT_TYPE = 16496;
/** number: 109 type: string */
public final static int ADDRESS = 41069;
/** number: 117 type: float */
public final static int AMOUNT = 24693;
/** number: 105 type: float */
public final static int BALANCE = 24681;
/** number: 104 type: long */
public final static int BRANCH_ID = 8296;
/** number: 114 type: string */
public final static int FIRST_NAME = 41074;
/** number: 106 type: long */
public final static int LAST_ACCT = 8298;
/** number: 113 type: string */
public final static int LAST_NAME = 41073;
/** number: 107 type: long */
public final static int LAST_TELLER = 8299;
/** number: 115 type: char */
public final static int MID_INIT = 16499;
/** number: 108 type: string */
public final static int PHONE = 41068;
/** number: 111 type: string */
public final static int SSN = 41071;
/** number: 116 type: long */
public final static int TELLER_ID = 8308;
/** number: 201 type: string */
public final static int SBALANCE = 41161;
/** number: 202 type: string */
public final static int SAMOUNT = 41162;
/** number: 203 type: short */
public final static int XA_TYPE = 203;
/** number: 204 type: string */
public final static int CURS = 41164;
/** number: 205 type: string */
public final static int SVCHG = 41165;
/** number: 206 type: string */
public final static int VIEWNAME = 41166;
/** number: 207 type: char */
public final static int OPEN_CR = 16591;
/** number: 208 type: char */
public final static int TYPE_CR = 16592;
public String Fldid_to_name(int fldid)
{
if ( fieldtonameHashTable == null ) {
fieldtonameHashTable = new Hashtable();
fieldtonameHashTable.put(new Integer(ACCOUNT_ID), "ACCOUNT_ID");
fieldtonameHashTable.put(new Integer(ACCT_TYPE), "ACCT_TYPE");
fieldtonameHashTable.put(new Integer(ADDRESS), "ADDRESS");
fieldtonameHashTable.put(new Integer(AMOUNT), "AMOUNT");
fieldtonameHashTable.put(new Integer(BALANCE), "BALANCE");
fieldtonameHashTable.put(new Integer(BRANCH_ID), "BRANCH_ID");
fieldtonameHashTable.put(new Integer(FIRST_NAME), "FIRST_NAME");
fieldtonameHashTable.put(new Integer(LAST_ACCT), "LAST_ACCT");
fieldtonameHashTable.put(new Integer(LAST_NAME), "LAST_NAME");
fieldtonameHashTable.put(new Integer(LAST_TELLER), "LAST_TELLER");
fieldtonameHashTable.put(new Integer(MID_INIT), "MID_INIT");
fieldtonameHashTable.put(new Integer(PHONE), "PHONE");
fieldtonameHashTable.put(new Integer(SSN), "SSN");
fieldtonameHashTable.put(new Integer(TELLER_ID), "TELLER_ID");
fieldtonameHashTable.put(new Integer(SBALANCE), "SBALANCE");
fieldtonameHashTable.put(new Integer(SAMOUNT), "SAMOUNT");
fieldtonameHashTable.put(new Integer(XA_TYPE), "XA_TYPE");
fieldtonameHashTable.put(new Integer(CURS), "CURS");
fieldtonameHashTable.put(new Integer(SVCHG), "SVCHG");
fieldtonameHashTable.put(new Integer(VIEWNAME), "VIEWNAME");
fieldtonameHashTable.put(new Integer(OPEN_CR), "OPEN_CR");
fieldtonameHashTable.put(new Integer(TYPE_CR), "TYPE_CR");
}
return ((String)fieldtonameHashTable.get(new Integer(fldid)));
}
public int name_to_Fldid(String name)
{
if ( nametofieldHashTable == null ) {
nametofieldHashTable = new Hashtable();
nametofieldHashTable.put("ACCOUNT_ID", new Integer(ACCOUNT_ID));
nametofieldHashTable.put("ACCT_TYPE", new Integer(ACCT_TYPE));
nametofieldHashTable.put("ADDRESS", new Integer(ADDRESS));
nametofieldHashTable.put("AMOUNT", new Integer(AMOUNT));
nametofieldHashTable.put("BALANCE", new Integer(BALANCE));
nametofieldHashTable.put("BRANCH_ID", new Integer(BRANCH_ID));
nametofieldHashTable.put("FIRST_NAME", new Integer(FIRST_NAME));
nametofieldHashTable.put("LAST_ACCT", new Integer(LAST_ACCT));
nametofieldHashTable.put("LAST_NAME", new Integer(LAST_NAME));
nametofieldHashTable.put("LAST_TELLER", new Integer(LAST_TELLER));
nametofieldHashTable.put("MID_INIT", new Integer(MID_INIT));
nametofieldHashTable.put("PHONE", new Integer(PHONE));
nametofieldHashTable.put("SSN", new Integer(SSN));
nametofieldHashTable.put("TELLER_ID", new Integer(TELLER_ID));
nametofieldHashTable.put("SBALANCE", new Integer(SBALANCE));
nametofieldHashTable.put("SAMOUNT", new Integer(SAMOUNT));
nametofieldHashTable.put("XA_TYPE", new Integer(XA_TYPE));
nametofieldHashTable.put("CURS", new Integer(CURS));
nametofieldHashTable.put("SVCHG", new Integer(SVCHG));
nametofieldHashTable.put("VIEWNAME", new Integer(VIEWNAME));
nametofieldHashTable.put("OPEN_CR", new Integer(OPEN_CR));
nametofieldHashTable.put("TYPE_CR", new Integer(TYPE_CR));
}
Integer fld = (Integer)nametofieldHashTable.get(name);
if (fld == null) {
return (-1);
} else {
return (fld.intValue());
}
}
public String[] getFldNames()
{
String retval[] = new String[22];
retval[0] = new String("ACCOUNT_ID");
retval[1] = new String("ACCT_TYPE");
retval[2] = new String("ADDRESS");
retval[3] = new String("AMOUNT");
retval[4] = new String("BALANCE");
retval[5] = new String("BRANCH_ID");
retval[6] = new String("FIRST_NAME");
retval[7] = new String("LAST_ACCT");
retval[8] = new String("LAST_NAME");
retval[9] = new String("LAST_TELLER");
retval[10] = new String("MID_INIT");
retval[11] = new String("PHONE");
retval[12] = new String("SSN");
retval[13] = new String("TELLER_ID");
retval[14] = new String("SBALANCE");
retval[15] = new String("SAMOUNT");
retval[16] = new String("XA_TYPE");
retval[17] = new String("CURS");
retval[18] = new String("SVCHG");
retval[19] = new String("VIEWNAME");
retval[20] = new String("OPEN_CR");
retval[21] = new String("TYPE_CR");
return retval;
}
}
十.WtuxC的使用--使用web services封装TUXEDO services
为bankapp.jws创建六个方法:CloseAccount, Deposit, GetBalance, OpenAccount, Transfer, Withdraw,分别用于封装Tuxedo Control的CloseAccount, Deposit, GetBalance, OpenAccount, Transfer, Withdraw方法。把BankCtrl.jcx控件拖放到bankapp.jws的右侧,界面如下:
十一.测试
在workshop中运行bankapp.jws进程测试,显示如下界面:
在GetBalance区域中,输入账号10000,点击GetBalance,得如下界面:

根据结果可知,账号10000的余额为,这与Tuxedo的本地客户端测试结果是一致的!
十二.结论
使用Workshop Tuxedo Control(WTuxC)控件可以很容易地把Tuxedo Services封装成web Services。WtuxC易于使用,程序不需要了解WTC或JOLT的开发细节。
十三. 备注
由于水平有限,不能很好地整理这个文档,但愿它对大家有所帮助,如有问题欢迎和我联系。
|