TUXEDO应用系统的配置(最全)_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 5608 | 回复: 0   主题: TUXEDO应用系统的配置(最全)        下一篇 
zwj0287
注册用户
等级:新兵
经验:66
发帖:4
精华:0
注册:2012-2-26
状态:离线
发送短消息息给zwj0287 加好友    发送短消息息给zwj0287 发消息
发表于: IP:您无权察看 2014-9-12 9:50:05 | [全部帖] [楼主帖] 楼主

有“.”等可以" "引起来,如: "DEMOSERVER.COM"

TUXCONFIG: 配置文件TUXCONFIG所在的路径

TUXDIR: TUXEDO的安装目录

APPDIR: TUXEDO应用系统所在的目录

注意:TUXCONFIG,TUXDIR,APPDIR的值要与它们在环境变量中的设置的值一样

ENVFILE: 该服务器上与TUXEDO有关的环境变量(如FIELDTBLS等)可以放到一个文件中,在ENVFILE中指定该文件名。

TYPE: 指定该服务器的类型,当两台服务器的TYPE不一样时,在它们之间传送数据时要进行

编码/解码工作

ULOGPFX: 指定ULOG文件所在的目录及前缀。默认目录为$APPDIR,前缀为ULOG。

UID,GID,PERM,MAXACCESSERS,MAXCONV这些在RESOURCES中的配置,在MACHINES中可以被重新配置,并且这些新的配置值会覆盖在RESOURCES中的配置值。

*GROUPS(必需):在TUXEDO中,要对SERVER进行分组,配置GROUP主要有三个目的,1.因为GROUP与数据库之间是一对一的关系,在一TUXEDO应用系统中,如果有多个数据库,就要配置多个GROUP,在该GROUP中配置TUXEDO与数据库的连接参数等。2. 数据依赖路由是以GROUP为单位的。3.进行系统迁移时也时以GROUP为单位的一个GROUP有一个名字,还有一个GROUPID,GROUP的名字和GROUP ID在一个TUXEDO系统中必须唯一。每个GROUP要指定该GROUP所在的服务器,及它的ID号,如果该GROUP中的SERVER要与数据库或其他的资源管理器相连,那么要在OPENINFO中设置连接的参数。具体的配置我们在讲数据库编程时再说明。*SERVERS:该系统所包含的所有的SERVER都在该节进行配置。在DEFAULT中的设置对所有的SERVER起作用。SRVGRP: 该SERVER所在的GROUPSRVID: 该SERVER所对应的ID,在一个GROUP中必须唯一MIN: 该SERVER最少启动的进程数MAX: 该SERVER最多可启动的进程数RESTART,RCMD,MAXGEN,GRACE: 在TUXEDO系统了,当一个SERVER进程因某中原因死掉时,可设置它可以自动重起,这4个参数指定TUXEDO的重起信息。RESTART 该进程死掉时是否可以自动重起,默认为N(不可以)GRACE,MAXGEN:在GRACE秒内,该进程最多可以重启MAXGEN次。RCMD: 指定该SERVER重启时,要执行的一个可执行文件名注意:1.为了使一个SERVER可以自动重起,光设置了RESTART=Y还不够,还要设置GRACE,MAXGEN才能在该SERVER死掉时,自动重起,2. 该SERVER能够被自动重起的一个前提条件时它还没有被从BULLITION BOARD中清除。例子:test SRVGRP=GROUP1 SRVID=1 RESTART=Y GRACE=100000 MAXGEN=255该设置指定在100000秒的时间内,SERVER进程:test可以启动255次。在缺省情况下,TUXEDEO的每一个SERVER对应一个请求队列,该SERVER从该请求队列中取客户端发来的请求,并把处理的结果通过该请求队列返回给客户端,TUXEDO的SERVER可以配置成多个SERVER对应一个请求队列,即MSSQ方式,以提高响应的速度。与MSSQ有关的参数是:RQADDR:该请求队列的名字,一般设成与该SERVER的名字一样RAPERM:该请求队列的存取权限,默认为0666REPLYQ:该SERVER中的某个SERVICE调用其他的SERVICE,并有返回结果,则应设置REPLYQ=Y,即把其他SERVICE的应答放到该队列中CONV: 该SERVER是否采用会话(CONVERSATION)通讯方式,注意采用会话通讯方式的SERVICE要单独在一个SERVER中,不能与采用其他通讯方式的SERVICE在同一个SERVER中,并且该SERVER要设置CONV=YCLOPT: 指定该SERVER的启动参数。默认为-A,即再该SERVER启动时,发布该SERVER包含的所有的SERVICE。通用的有:-e: 指定错误输出文件,默认为$APPDIR下的stderr-o: 指定标准输出文件,默认为$APPDIR下的stdout-r: 记录该SERVER中SERVICE每次调用的处理时间,并记录在错误输出文件中,然后可采用TUXEDO的性能分析工具txrpt对该SERVER进行性能分析。-A: 发布该SERVER包含的所有的SERVICE *SERVICES:在SERVICES中可针对每个SERVICE进行配置,主要有:AUTOTRAN: 调用该SERVICE时是否自动启一个全局事务。默认为NLOAD:如果采用负载均衡,指定该SERVICE的负载因子,默认为50PRIO: 指定该SERVICE的优先级,默认为50DDR: 指定数据依赖路由规则与远程客户端有关的配置:1.在MACHINES中要配置MAXWSCLIENTS,即最多可以有多少个远程客户端同时连接到该服务器上,在上面的例子中为5个2. 在SERVERS中要配置SERVER:WSLWSL SRVGRP="GROUP1" SRVID=1116 CLOPT="-A -- -n //192.168.120.113:8888 -m 2 -M 5 -x 6"说明:-n //192.168.120.113:8888: 远程客户端通过该端口与服务器建立连接-m 2 :最少启动多少个WSH进程-M 5::最多启动多少个WSH进程,默认值为MAXWSCLIENTS/m-x 6:每个WSH进程可同时处理多少个远程客户端3.程客户端所在的服务器上要配置WSNADDR环境变量,它的值为-n参数的值,如在上面的配置中为:SET WSNADDR= //192.168.120.113:8888配置文件UBBCONFIG的编译:用下面的命令进行编译:tmloadcf –y UBBCONFIG文件名如:下面的命令编译名为ubbsimple的TUXEDO配置文件,生成二进制的配置文件TUXCONFIGtmloadcf –y ubbsimple有时候在改变了TUXCONFIG的目录后,执行tmloadcf,会出现类似下面的错误,可把原来的TUXCONFIG文件删除,然后再编译。D:\simpdb>tmloadcf -y ubbCMDTUX_CAT:1601: ERROR: TUXCONFIG,TUXOFFSET d:\simpdb\tuxconfig 0 doesn't match first device entry on configuration d:\tuxdemo\simpdb\tuxconfig 0D:\simpdb>del tuxconfigD:\simpdb>tmloadcf -y ubbD:\simpdb>用tmunloadcf命令可对二进制的配置文件TUXCONFIG的进行反编译如下面的命令反编译TUXCONFIG,并把结果输出到文件myubb中。通过反编译TUXCONFIG可查看该TUXEDO应用系统的一些属性默认值。Tmunloadcf >myubb

3.2 多机(MP)模式的配置一个TUXEDO应用系统可以部署在多台服务器上,这些服务器通过网络连接,这种部署方式称为MP方式,在这些服务器中要选择一台服务器做MASTER服务器,在该服务器上有一个DBBL进程,负责整个TUXEDO应用系统的管理工作。在每台服务器上都有一个BBL进程,它与DBBL进程进行通信,管理各自服务器上的配置。每台服务器上还有一个名为BRIDGE的进程和一个名为TLISTEN的进程,他们负责服务器之间的通讯。MP模式的结构如图:

如果配置了MP方式,那么在这些服务器之间可以做负载均衡和容错,客户端可以和其中的任何一台服务器建立连接,如果该服务器上没有该客户端所要调用的服务(SERVICE),TUXEDO可以自动把请求发送到别的有该服务的机器取处理,并把结果返回个客户端,如图,SITE1上的客户端调用了TRANSFER,当在SITE1上没有该SERVICE,在SITE3上有,那么SITE1通过BRIDGE把请求发送到SITE3上,SITE3把处理结果也通过BRIDGE发送到SITE1上,通过SITE1把结果返回给该客户端。这些对客户端时透明的。如果SITE1,STIE2,SITE3上都有TRANSFER,并且设置了负载均衡(LDBAL =Y),那么TUXEDO将根据他们的负载情况把请求发送到负载较小的服务器上。如果SITE1,SITE2,SITE3中的某一台或两台服务器出故障了,那么正常的机器仍然能够继续运行,如果时他们之间的网络连接断了,BRIDGE进程会自动进行重试,并且在这些服务器之间可以配置多个网络连接通路,当其中的一个出现故障时,会自动采用别的连接通路。所以MP方式提供了一个高可靠性的分布式应用系统。配置成MP方式的步骤:1. 这些服务器之间可以通过网络互相访问2. 在每台服务器上都正确安装了TUXEDO SERVER3. 应用已发布到这些服务器上4. 选择一台服务器做MASTER机,6. 在RESOURCES,MACHINES,NETWORK,NETGROUPS中做相应的配置RESOURCE:MODEL要设为MPOPTIONS中要有LANMASTER服务器上的DBBL负责与其他服务器上的服务器BBL进行通讯,BBLQUERY: 每台服务器上的BBL每隔SCANUNIT*BBLQUERY秒,向MASTER机上的DBBL发送一次状态信息。默认为300秒DBBLWAIT: 如果MASTER机没有收到某台服务器发送的状态信息,它将等待SCANUNIT*DBBLWAIT秒,如果还没有收到该服务器发送的状态信息,这台服务器将被分离出去(PARTITIONED),默认为20秒MACHIENS:在MACHINES中要配置该TUXEDO应用系统包括的每台服务器,如果该服务器时UNIX服务器,那么要配置UID,GID,UID,GID为TUXEDO用户所对应的UID,GID,在UNIX下可以用ID命令查看。

NETWORK:在该节中配置服务器之间通讯的IP地址及BRIDGE进程,在一个MP方式的TUXEDO应用系统中,不同的服务器之间通过BRIDGE进程进行通讯,该BRIDGE的侦听IP地址及端口在NADDR中指定。如果是在UNIX下要指定该BRIDGE所用的网络设备,如果是在NT下则不要。在TUXEDO系统启动前,不同服务器之间的通讯是通过tlisten进程来进行的,因为这时还没有BRIDGE进程。NLSADDR为tlisten进程侦听的IP地址及端口。一个MP方式的配置例子。环境:WIN2000服务器一台,安装TUXEDO6.5, 服务器名WIN,IP地址:10.13.1.124SUN5.8服务器一台,安装TUXEDO6.5, 服务器名SUN,IP地址:12.22.32.35MASTER机为WIN2000服务器,BACKUP机为SUN。在WIN2000服务器上的UBBCONFIG的内容如下,在SUN服务器上不用编写UBBCONFIG文件。当启动时DBBL会自动把WIN2000服务器上的TUXCONFIG文件发送到SUN服务器上。*RESOURCESIPCKEY 87656MASTER site1,site2MAXACCESSERS 40MAXSERVERS 40MAXSERVICES 40MODEL MPOPTIONS LAN*MACHINESWIN LMID=site1APPDIR="d:\tuxdemo\mp"TUXCONFIG="d:\tuxdemo\mp\tuxconfig"TYPE="win2000"TUXDIR="d:\tuxedo65"SUN LMID=site2UID=1006GID=30APPDIR="/export/home/simpapp"TUXCONFIG="/export/home/simpapp/tuxconfig"TYPE="sun"TUXDIR="/export/home/tuxedo"*GROUPSGROUP1LMID=site1 GRPNO=1 OPENINFO=NONEGROUP2LMID=site2 GRPNO=2 OPENINFO=NONE

*NETWORKsite1 NADDR="//10.13.1.124:6000"NLSADDR="//10.13.1.124:6001"
site2 NADDR="//12.22.32.35:6000"NLSADDR="//12.22.32.35:6001"BRIDGE="/dev/tcp" *SERVERSDEFAULT:CLOPT="-A"simpserv SRVGRP=GROUP2 SRVID=3*SERVICESTOUPPER


1. 在WIN2000服务器上把该UBBCONFIG编译成TUXCONFIGtmloadcf -y ubbmp2. 在WIN2000服务器上启动tlisten进程tlisten -l //10.13.1.124:60013. 在SUN服务器上启动tlisten进程tlisten -d /dev/tcp -l /12.22.32.35:60014. 在WIN2000服务器上启动该TUXEDO应用系统tmboot -yTUXEDO会先启动WIN2000服务器上的进程,然后再启动SUN服务器上的进程。5. 在WIN2000服务器上执行simpcl mp test因为WIN2000服务器上没有TOUPPER服务,TUXEDO会自动调用SUN服务器上的TOUPPER服务,并把结果返回给客户端,这一切对客户端来说是透明的

Tuxedo 与数据库互联

2.2.1 概述

    在两层的 C/S结构中,客户端直接访问数据库,当采用TUXEDO中间件后,形成三层结构。这时,客户端

不直接访问数据库,而是改为调用中间件TUXEDO服务端上的服务,由TUXEDO服务端访问数据库,并把结果返回

给客户端。TUXEDO服务端可以和ORACLE在同一台服务器上,也可以在不同的机器上。如果在不同的机器上,在

TUXEDO的服务端所在的机器上要安装一个ORACLE的客户端。

TUXEDO服务端与ORACLE数据库连接有两种方式:1. 不通过 XA 接口直接互连。适用于整个系统只有一个数据库的情况。2. 通过 XA 接口互连,对整个系统有一个或多个数据库都适用,建议采用。

2.2.1 系统说明操作系统:WINDOW XP + SP2TUXEDO 版本:9.0 安装目录 c:\bea\tuxedo9.0ORACLE 版本:10g 安装目录 c:\oracle开发工具:VS 2005, VC 6.0

所有配置文件、源代码文件和执行程序所在目录:d:\zwtest

我根据自己的测试设置的环境变量,仅供在编译程序和启动tuxedo服务出错时比较1.用户环境变量

    APPDIR,值为 :d:\zwtest

    TUXCONFIG,值为:d:\zwtest\tuxconfig

    INCLUDE,值为:        C:\oracle\product\10.2.0\db_1\OCI\include;        C:\Program Files\Microsoft Visual Studio 8\VC\include;

2.系统环境变量

    INCLUDE,值为:        C:\Program Files\Microsoft Visual Studio 8\VC\include;        C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include;        C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include;        C:\Program Files\Microsoft Visual Studio\VC98\Include;        C:\Program Files\Microsoft Visual Studio 8\VC\include;

    LD_LIBRARY_PATH,值为:         $LD_LIBRARY_PATH:$TUXDIR/lib

    LIB,值为:        C:\Program Files\Microsoft Visual Studio 8\VC\lib;        C:\tools\xerces-c_2_3_0-win32\xerces-c_2_3_0-win32\lib;        C:\Program Files\Microsoft Visual Studio\VC98\Lib;

    path,值为:        %TUXDIR%\bin;        C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;        C:\oracle\product\10.2.0\db_1\BIN;        C:\Program Files\Microsoft Visual Studio 8\VC\bin;

    TUXDIR,值为:C:\bea\tuxedo9.0

2.2.2 配置的步骤2.2.2.1 ORACLE的配置1.以 dba 的权限进入sqlplus(默认口令是oracle)

C:\>sqlplus / as sysdba


2.搜索一下 xaview.sql 所在的位置(本例是在 C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\ 下)

运行:    SQL>@C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\xaview.sql;

如果一切正长则会提示创建了两个视图

3.授权    SQL>grant select on v$xatrans$ to public with grant option;    SQL>grant select on v$pending_xatrans$ to public with grant option;

4. 用 system 用户(缺省口令是manager,请根据实际情况修改)连接并授权    SQL>connect system/manager;    SQL>grant select any table to public;

5. 以system的身份建表,并插入2条测试记录    SQL>create table zwtest (name varchar2(8), age number);    SQL>insert into zwtest values('zhang', 30);    SQL>insert into zwtest values('liu', 27);    SQL>commit;

2.2.2.2 TUXEDO的配置1. 修改 tuxedo 安装路径下的udataobj目录下的RM文件,在以Oracle_XA:xaosw:开头的那行开头加上#注释掉   如果是windows平台,就添加以下行:       Oracle_XA;xaosw;C:\oracle\product\10.2.0\db_1\RDBMS\XA\oraxa10.lib C:\oracle\product\10.2.0\db_1\precomp\LIB\orasql10.lib   如果是unix平台,就添加:       Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh

注意:   上述库文件的位置可能随版本不同而不同,修改时以在本地机器上的实际位置为准

2. 在TUXEDO 用户下创建TMS文件:TMS_ORA10g, TUXEDO通过 TMS_ORA10g 与 ORACLE数据库采用 XA 协议进行通讯   buildtms -o c:\bea\tuxedo9.0\bin\TMS_ORA10g -r Oracle_XA

注意:    1.要是在windows平台下就在命令行窗口中运行,并确保c:\bea\tuxedo9.0\bin已经添加到系统的path环境变量中(可用echo %path% 查看)。      这个过程中有可能会提示找不到一些头文件或库文件,一般都是所缺文件所在路径没有包含在path或INCLUDE或LIB的环境变量中引起的,      可以搜索所缺文件的目录,把这个目录添加到对应的环境变量中。添加完后要打开一个新的命令行窗口才会生效。    2.如果TUXEDO服务端与ORACLE数据库不在同一台服务器上,可能会提示找不到库文件 oraxaX.lib和 orasqlX.lib(文件名中的大写X表示对应      的oracle版本号),可到ORACLE数据库的服务端对应目录下把这两个文件拷到本地机器ORACLE的客户端下的对应目录下。

3. 配置 ubbconfig(1) 在 *MACHINES 中增加:

TLOADDEVICE = "/home/oracle/temp/simpdb/TLOG"TLOGNAME=TLOGTLOGSIZE=200


(2) 改 *GROUPS 的配置为:*GROUPSGROUP1 LMID=simple GRPNO=1OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."TMSNAME="TMS_ORA10g" TMSCOUNT=2

注意:scott/tiger 为《tuxedo 简易培训教程》上数据库所采用的用户及口令,在我的测试平台上导致tuxedo服务启动时 TMS_ORA10g无法启动,      所及建议用 system用户和对应密码 替换 OPENINFO中的 scott/tiger。

      如果要试一下 scott 用户, 一般应先以system或sysdba用户登录sqlplus,然后对scott用户进行解锁:          alter user scott account unlock;      然后才能以scott用户登录,再根据提示修改默认密码。

修改后的配置文件 ubbconfig 内容如下:*RESOURCESIPCKEY 123456DOMAINID simpappMASTER simpleMAXACCESSERS 100MAXSERVERS 50MAXSERVICES 100MODEL SHMLDBAL N*MACHINESservername LMID=simpleAPPDIR="D:\simapp"TUXCONFIG="D:\simapp\tuxconfig"TUXDIR="C:\bea\tuxedo9.0"TLOGDEVICE="D:\simapp\TLOG"TLOGNAME=TLOGTLOGSIZE=100*GROUPSGROUP1 LMID=simple GRPNO=1OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=600+MaxCur=5+LogDir=."TMSNAME="TMS_ORA10g" TMSCOUNT=2*SERVERSDEFAULT:   CLOPT="-A"exefilename SRVGRP=GROUP1 SRVID=1*SERVICES

注:    1) *MACHINES下的 servername 是指服务器所在的完整的计算机名

    2) exefilename 是服务端可执行程序名,不加后缀,如果写错了在启动tuxedo服务时会出现以下报错:            CMDTUX_CAT:816: ERROR: Cannot exec, executable file not found

    3) *GROUPS 的 OPENINFO中,如果用scott用户登录,则启动tuxedo服务时会出现以下报错:   exec TMS_ORA10g -A :          Failed.   用system用户登录则正常,可能和oracle相关的配置有关。但是以 system 用户登录后,在随后        执行客户端示例程序时也会报错:   tpcall failed, tperrno=11, tperrtext=TPESVCFAIL - application level service failure查看ULOG文件,提示 select from EMP failure, sqlcode=-942, sqlerr=ORA-00942: 表或视图不存在        然后用system用户登录sqlplus,查询EMP表:   select * from EMP;果然提示: ORA-00942: 表或视图不存在        再用scott连接:   conn scott/aiuuai;查询EMP表返回正确结果。总结: 用示例程序测试时,要么正确配置 Oracle 使TMS可以通过scott用户连接到oracle,要么以system               用户建新表作为被测的数据表,后者可能更容易些。

    4) 在应用配置里提到,*SERVICES 提供了应用的特殊交易的信息。包括负载平衡(LOAD)和数据缓冲类型检查(BUFTYPE)。        如果全部都是缺省值则本节可以省略。所以,*SERVICES下没有内容

(3) 最后生成 tuxconfig:

tmloadcf -y ubbconfig


        系统自动生成一个 tuxconfig 文件, -y 的意思是无条件地覆盖已经存在的 tuxconfig 文件。

以下是我定义的 ubbconfig 内容:

*RESOURCESIPCKEY 123456 #<Replace with a valid IPC Key>DOMAINID zwtest MASTER simpleMAXACCESSERS 10MAXSERVERS 5MAXSERVICES 10MODEL SHMLDBAL N
*MACHINESAPPDIR= "D:\zwtest" #"<Replace with the current directory pathname>"TUXCONFIG= "D:\zwtest\tuxconfig" #<Replace with your TUXCONFIG Pathname>"TUXDIR= "C:\bea\tuxedo9.0" #"<Directory where TUXEDO is installed>""HP12193906110" LMID=simpleTLOGDEVICE="D:\zwtest\TLOG"TLOGNAME=TLOGTLOGSIZE=100
*GROUPSGROUP1 LMID=simple GRPNO=1 OPENINFO=NONEOPENINFO="Oracle_XA:Oracle_XA+Acc=P/system/aiuuai+SesTm=600+MaxCur=5+LogDir=."TMSNAME="TMS_ORA10g" TMSCOUNT=2
*SERVERSDEFAULT:CLOPT="-A"testsvr SRVGRP=GROUP1 SRVID=1
*SERVICES


4.重命名下列文件,因为下列文件名与ORACLE带的文件名有冲突,所以要更改(1) tuxedo安装路径 include目录下的:sqlca.h 改为 sqlca.h.bbbsqlcode.h 改为 sqlcode.h.bbbsqlda.h 改为 vsqlda.h.bbb(2) tuxedo安装路径 lib目录下的:libsql.lib 改名为 libsql.lib.bbb

注意:   在oracle10g下,只发现sqlca.h, sqlda.h和tuxedo有重名文件,实际修改时最好先在oracle安装目录中查找 sqlca.h , sqlcode.h , sqlda.h , libsql.lib 这4个文件,如果和tuxedo安装目录下有重名文件,则将tuxedo目录下的重名文件作以上的更名修改

5.用TMADMIN 创建 TLOG文件,TUXEDO用一个文件TLOG记录对数据库操作的日志。用于协调分布式数据库的提交与回滚。D:\>tmadmin>crdl -b 500 -z d:\zwtest\TLOG>crlog -m simple>q

2.2.2.3 服务端的程序:(1) testsvr.pc ,功能:根据客户端传入的EMPNO到表EMP中取ENAME的值,并把它返回给客户端。    但实际运行时会有错误返回,查ULOG发现是将从客户端收到的字符串转换为long型时有误,    因而导致错误的empno,所以查不到对应的ename,oracle查询返回"未找到数据"的错误,进而    使服务端返回交易失败的错误信息

/* testsvr.pc */
#include <stdio.h>#include <atmi.h>#include <userlog.h>
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
long al_empno=0;
char ac_ename[11]="";
EXEC SQL VAR ac_ename IS STRING(11);
EXEC SQL END DECLARE SECTION;
TEST(TPSVCINFO *rqst){ /* recv data from client */
      al_empno = (FBFR32 *)rqst->data;
      EXEC SQL select ename into :ac_ename from EMP where empno=:al_empno;
      if (sqlca.sqlcode != 0) { userlog ("select from EMP failure, sqlcode=%ld, sqlerr=%s\n", sqlca.sqlcode, (char*)sqlca.sqlerrm.sqlerrmc);
            strcpy (rqst->data, sqlca.sqlerrm.sqlerrmc);
      tpreturn (TPFAIL, 0, rqst->data, 0, 0); }
      /* return the record set to client */ strcpy (rqst->data, ac_ename);


    tpreturn (TPSUCCESS, 0, rqst->data, 0, 0);}***************************************************************************************(2) 修改后的 testsvr.c, 经测试可以正常运行,返回结果    并增加了一个将收到的字符串转换为大写并返回的服务(交易) UPPER

/* testsvr.pc */
#include <stdio.h>#include <atmi.h>#include <userlog.h>#include <stdlib.h>
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int al_age=0;
char ac_name[11]="";
EXEC SQL VAR ac_name IS STRING(11);
EXEC SQL END DECLARE SECTION;
GETNAME(TPSVCINFO *rqst){ /* recv data from client */ al_age = atoi (rqst->data);
      EXEC SQL select name into :ac_name from zwtest where age=:al_age;
      if (sqlca.sqlcode != 0) { userlog ("select from help failure, sqlcode=%ld, sqlerr=%s, age=%d\n", sqlca.sqlcode, (char*)sqlca.sqlerrm.sqlerrmc, al_age);
            strcpy (rqst->data, sqlca.sqlerrm.sqlerrmc);
      tpreturn (TPFAIL, 0, rqst->data, 0, 0); }
      /* return the record set to client */ strcpy (rqst->data, ac_name);
tpreturn (TPSUCCESS, 0, rqst->data, 0, 0);}
UPPER(TPSVCINFO *rqst){int i;
userlog("request string = %s\n", rqst->data);
for (i=0; i<rqst->len-1; i++)rqst->data[i] = toupper(rqst->data[i]);
tpreturn (TPSUCCESS, 0, rqst->data, 0L, 0);


2.2.2.4 编译服务端程序1.用ORACLE的 proc 把 testsvr.pc 文件预编译成 testsvr.c 文件    d:\zwtest\proc testsvr.pc include=%TUXDIR%\include

2.用buildserver把第一步生成的 testsvr.c 编译成可执行文件,注意 -r 后带的 Oracle_XA 要与 RM 文件中的一致。    d:\zwtest\buildserver -o testsvr -f testsvr.c -r Oracle_XA -s GETNAME, UPPER

2.2.2.5 编写客户端程序:(1) testcli.c, 发送一个字符串给服务端,接收服务端传回的转换为大写的字串

/* testcli.c */
#include <stdio.h>#include <string.h>#include "atmi.h"
int main (int argc, char *argv[]){ long reqlen = 1024;
      char *reqbuf;
if (argc != 2) { printf ("usage: testcli string\n"); exit (0); }
      /* connect to tuxedo server */if (tpinit ((TPINIT *) NULL) == -1) { (void) fprintf (stderr, "Tpinit failed\n");
      exit (1); }
      /* allocate send buffer */ reqbuf = (char *) tpalloc ("STRING", NULL, reqlen);
if (reqbuf == (char *)NULL) { printf("tpalloc failed\n"); tpterm(); }
      strcpy (reqbuf, argv[1]);printf("reqbuf = %s\n", reqbuf);
      /* call server "UPPER" of tuxedo */ if (tpcall ("UPPER", (char *)reqbuf, 0L, (char**)&reqbuf, (long *)&reqlen, 0 ) < 0) { printf ("tpcall failed, tperrno=%ld, tperrtext=%s\n", tperrno, tpstrerror(tperrno));
            tpfree (reqbuf);
            tpterm ();
      exit (1); }
      printf ("return = %s\n", reqbuf);
      tpfree (reqbuf);
      tpterm ();


    return (0);}****************************************************************************(2) testdbcli.c,传递一个年龄值给服务端,服务端查oracle数据库后返回对应的姓名

/* testdbcli.c */
#include <stdio.h>#include <string.h>#include "atmi.h"
int main (int argc, char *argv[]){ char *reqbuf; int reqlen = 11;
if (argc != 2) { printf ("usage: testdbcli age_number\n"); exit (0); } /* connect to tuxedo server */if (tpinit ((TPINIT *) NULL) == -1) { (void) fprintf (stderr, "Tpinit failed\n");
      exit (1); }
      /* allocate send buffer */ reqbuf = (char *) tpalloc ("STRING", NULL, reqlen);
if (reqbuf == (char *)NULL) { printf("tpalloc failed\n"); tpterm(); }
      memset(reqbuf, 0, reqlen);strcpy(reqbuf, argv[1]);
      printf("reqbuf = %s\n", reqbuf);
      /* call server "GETNAME" of tuxedo */ if (tpcall ("GETNAME", (char *)reqbuf, 0L, (char**)&reqbuf, (long *)&reqlen, 0 ) < 0) { printf ("tpcall failed, tperrno=%ld, tperrtext=%s\n", tperrno, tpstrerror(tperrno));
            tpfree (reqbuf);
            tpterm ();
      exit (1); }
      printf ("name = %s\n", reqbuf);
      tpfree (reqbuf);
      tpterm ();
return (0);}


2.2.2.6 编译客户端程序

d:\zwtest\buildclient -o testcli -f testcli.c    d:\zwtest\buildclient -o testdbcli -f testdbcli.c


2.2.2.7 启动 tuxedo    d:\zwtest\tmboot -y

如果显示提示信息:

Booting all admin and server processes in D:\zwtest\tuxconfigINFO: BEA Tuxedo, Version 9.0, 32-bit, Patch Level (none)INFO: Serial #: 650522264138-1796918373125, Expiration 2006-01-15, Maxusers 100INFO: Licensed to: BEA Evaluation Customer
Booting admin processes ...
exec BBL -A :        process id=3960 ... Started.
Booting server processes ...
exec TMS_ORA10g -A :        process id=2692 ... Started.exec TMS_ORA10g -A :        process id=2588 ... Started.exec testsvr -A :        process id=2872 ... Started.4 processes started.


就说明服务正确启动了, 这时就可以在客户端所在目录下运行客户端程序:

D:\zwtest>testcli.exe helloreqbuf = helloreturn = HELLO
D:\zwtest>testdbcli.exe 30reqbuf = 30name = zhang


如果提示:

Booting all admin and server processes in D:\zwtest\tuxconfigINFO: BEA Tuxedo, Version 9.0, 32-bit, Patch Level (none)INFO: Serial #: 650522264138-1796918373125, Expiration 2006-01-15, Maxusers 100INFO: Licensed to: BEA Evaluation Customer
Booting admin processes ...
exec BBL -A :        process id=3920 ... Started.
Booting server processes ...
exec TMS_ORA10g -A :        Failed.exec TMS_ORA10g -A :


并且程序停止不动,也不退出,好像死了一样

这就是TMS_ORA10g 在启动时发生了错误,本例中是由于前面提到的OPENINFO中使用scott用户引起的,这样就会在当前目录生成一个 *.trc 文件,记录失败的原因。同时 tuxedo 的 ULOG.MMDDYY 文件中也会记录一些错误信息,以供进行错误分析。

假死的程序可以用 Ctrl+C 来终止,然后用 tmshutdown -y 来关闭已经启动的 BBL 和其他服务。最后可以用 tmshutdown -y来检测所有服务是否已关闭,提示:Shutting down all admin and server processes in D:\zwtest\tuxconfig

tmshutdown: internal error: CMDTUX_CAT:764: ERROR: can't attach to BB就表示本机的服务已经被关闭,这时就可以去修改ubbconfig,重新生成tuxconfig,然后再启动服务。需要对服务端程序进行修改时,也必须先tmshutdown -y,才能修改服务端程序并重新生成可执行程序。

=============================================================

折磨我两天的 tuxedo buildserver 编译服务启动挂起问题终于解决,不容易啊,为了让有过类似经历的人省下点时间,现记录如下:故障现象:准备将原系统 redflag4.0+tuxedo8.0+oracle 8.1.7的系统移植到redfalg5.0+tuxedo8.1+oracle10g开发环境:proc,gcc3.4.6好,部署软件环境,修改环境变量,更改tuxedo的某些oracle的头文件,如slqda.h等...在此不详细说明,网上有不少相关文档,可以查看.经过一番折腾,buildserver终于将服务编译通过,happy!go on!tmboot -y..........CMDTUX_CAT:819: INFO: Process id=16218 Assume started (pipe).查看ULOG,一些扯淡的话142508.kaifa!BBL.14662.3086919904.0: 09-03-2004: Tuxedo Version 8.1, 32-bit, Patch Level 099142508.kaifa!BBL.14662.3086919904.0: LIBTUX_CAT:1434: ERROR: Invalid trace specification; ignored142508.kaifa!BBL.14662.3086919904.0: LIBTUX_CAT:1434: ERROR: Invalid trace specification; ignored142508.kaifa!BBL.14662.3086919904.0: LIBTUX_CAT:577: ERROR: Unable to register because the slot is already owned by another process142508.kaifa!BBL.14662.3086919904.0: LIBTUX_CAT:248: ERROR: System init function failed, Uunixerr =142508.kaifa!BBL.14662.3086919904.0: CMDTUX_CAT:26: INFO: The BBL is exiting system............142508.kaifa!GWADM.14726.3086341824.0: LIBTUX_CAT:262: INFO: Standard main starting142508.kaifa!DMADM.11747.3086805376.0: CMDGW_CAT:3250: ERROR: Cannot send config to GWADM group=LDMGRP_1142508.kaifa!GWADM.14726.3086341824.0: LIBTUX_CAT:250: ERROR: tpsvrinit() failed没用,继续找tpsvrinit中连接数据库hang,问题就出在这这个环境没有用xa连接,直接EXEC SQL CONNECT好,拿sqlplus手工连接测试,没问题阿。那好,直接写个带proc连接数据库的干净的(不加载一些乱七八糟的库)可执行文件,测试,成功。那用buildclient写个可执行文件,测试,成功。那就是buildserver不行阿 ,好,拿tuxedo提供的sample编译个服务,测试,失败。原来跟我没关系阿,就是tuxedo和oracle之间的问题了上网goooooooooooooogle不好找阿,好不容易有点感觉了,得出猜测:tuxedo8.1和oracle10g 某些库冲突,tuxedo8.1 需要打补丁,(tuxedo9.1也有这中情况),可是这个补丁就是找不到阿,快崩溃了期间请教了n个师傅无果,无意中又找到n+1个师傅,终于.......问题出在这 ;libclntsh.so.10.1,记住这个so$ORACLE_HOME/lib下有这个动态链接库同样/usr/lib下也有这个动态库,删掉,问题解决。但是有点疑问,环境变量写死指向ORACLE的库了,ldd 可执行文件 也指向了ORACLE的库了,虽说/usr/lib下的优先级高,但是可执行文件在运行加载动态库时怎么找到/usr/lib下的冲突的这个库libclntsh.so.10.1的呢

掌握tuxedo中STRING类型buffer的用途

掌握tuxedo中CARRAY类型buffer的用途

掌握tuxedo中FML(FML32)类型buffer的用途

掌握tuxedo中VIEW(VIEW32)类型buffer的用途注:后续的课程将介绍Tuxedo新增的数据类型:EFML(Embedded Record in FML)、XML Buffer二、 String类型buffer介绍(1)STRING类型buffer简介STRING类型buffer是主要用于面向行、变长度的文本信息类型buffer。STRING类型buffer要求必须以NULL作为结束符的。如果系统采用STRING类型,那么在配置ubbconfig文件时,必须在*MACHINE部分配置TYPE,指明buffer类型为STRING类型。在两种不同类型架构的机器进行buffer传输时候,TUXEDO对STRING类型buffer进行加码、解码过程。无论系统申请了多少长度的buffer,系统自动按着NULL所在的位置决定STRING类型的buffer长度。(2)STRING类型buffer如何申请char *SndBuf;SndBuf = (char *) tpalloc("STRING",NULL,1024)(3)STRING类型使用方法和调用方法strcpy(SndBuf,"Bea Tuxedo");tpcall("TOUPPER",SndBuf,0,&RcvBuf,&len,0);三、 CARRAY类型buffer介绍(1)CARRAY类型buffer简介CARRAY类型buffer是一种独立于机器的buffer类型。用户在使用时必须指定CARRAY类型数据的长度,CARRAY类型数据可以包含NULL字符。CARRAY类型数据不需要加、解码过程。CARRAY类型数据可以用来传输汉字、二进制数据、文件、图形等。CARRAY类型可以作为FML(FML32)、VIEW(VIEW32)的数据类型子项buffer。(2)CARRAY类型buffer如何申请tpalloc("CARRAY",NULL,1024*2)(3)CARRAY类型使用方法和调用方法四、 VIEW(VIEW32)类型buffer介绍(1)VIEW类型buffer简介Tuxedo使用VIEW类型buffer处理类似C语言的结构等数据类型复杂数据。使用VIEW类型buffer可以将各数据元素与一种结构数据类型结合,通过结构就可以访问各数据元素。VIEW类型数据即使没有没有数据也占用空间,结构发生变化,需要重新编译程序。注明:(VIEW类型buffer是16位寻址的,VIEW32是32位寻址的.)(2)VIEW类型buffer使用方法使用VIEW类型数据步骤:

建立VIEW文件

设置环境变量

编译VIEW文件

在代码中包含VIEW头文件,在程序中使用VIEW结构及API函数

编译程序

运行程序(1)建立VIEW文件 VIEW user $ /* VIEW structure for user information */ #type   cname   fbname count flag size null long    count COUNT 1      -    - “”    0 float   sumfee SUMFEE   1      -    -     0.0 string usrname USRNAME 1      -    80 “” short   num      NUM      1      -    -     0 END (2)设置环境变量/* view文件存放路径,使用冒号分割(NT用分号)*/VIEWDIR=$APPDIR/inc/* 用逗号分割的二进制view文件 */VIEWFILES=user.V export VIEWDIR VIEWFILES(3)编译VIEW文件

使用viewc(viewc32)编译view文件$viewc -n user.v

view命令简介:viewc [-n] [-d viewdir] viewfile [viewfile ...]或者:viewc32 [-n] [-d viewdir] viewfile [viewfile ...][-d viewdir]:指定输出文件的路径(默认在当前目录下)[-n]:指定在编译view结构类型数据不产生FML buffer数据结构(4)view编译后生成的头文件 struct user { /* VIEW structure for user information */     long    count;     float   sumfee;     char    usrname[80];     short num; }; (5)VIEW类型buffer的使用struct user *pszUser;pszUser=(struct user *)tpalloc("VIEW"," user",sizeof(user));…………………pszUser ->count = 1680;pszUser ->sumfee = 198.96;strcpy(pszUser->usrname,"Wsy");pszUser->num = 160;…………………tpcall("PSVC",(char *)pszUser,0,(char **)&pszUser,&rcvlen,0);…………………五、 FML(FML32)类型buffer介绍(1)VIEW类型buffer简介FML类型buffer允许存取多个命名的字段。例如:(NAME: "BEA",ADDRESS "China Beijing",PHONE "010-85281188")。每一个命名的字段可以在buffer中存放零个或更多个(occurrences)的值.注明:(FML类型buffer是16位寻址的,FML32是32位寻址的.)(2)FML支持的数据类型:

Short
Char
Long
Float
Double
String


Carray(3)FML类型buffer使用方法使用FML类型数据步骤:

建立FML文件

设置环境变量

编译FML文件

在代码中包含FML头文件,在程序中使用FML API函数

编译程序

运行程序(1)建立FML Field Table文件 *base 1000 # name   number type flags comments COUNT    1        long    -   - SUMFEE   2        float   - - USRNAME 3        string -   - NUM       4        short -   - (2)设置环境变量set FLDTBLDIR32="c:\tuxedo\wsy"set FIELDTBLS32=user.fld其中:FLDTBLDIR(FLDTBLDIR32):指明Field Table文件的名字,多个用逗号分割FIELDTBLS (FIELDTBLS32):Filed Table文件的所在路径,多个用冒号分割,在WinNT系统中使用分号分割.(3)编译FML Field Table文件

使用mkfldhdr(mkfldhdr32)编译Field Table文件$mkfldhdr32 user.fld(4)FML Field Table编译后生成的头文件 /* fname   fldid            */ /* -----   -----            */ #define COUNT   ((FLDID32)33555433) /* number: 1001 type: long */ #define SUMFEE ((FLDID32)100664298)/* number: 1002 type: float */ #define USRNAME ((FLDID32)167773163)/* number: 1003 type: string */ #define NUM ((FLDID32)1004) /* number: 1004 type: short */ (5)FML类型buffer的使用FBFR32 *SndBuf;SndBuf = (FBFR32 *)tpalloc("FML32",NULL,1024);…………………lCount = 1680;Fchg32(SndBuf, COUNT,0,(char *)&lCount ,0);fSumFee = 198.96;Fchg32(SndBuf, SUMFEE, (char *)&fSumFee,0);Strcpy(sUsrName , "wsy");Fchg32(SndBuf, USRNAME, (char *)sUsrName,0);iNum = 160;Fchg32(SndBuf, SUMFEE, (char *)&iNum,0);…………………tpcall("PSVC",(char *) SndBuf,0,(char **)& SndBuf,&rcvlen,0);Fget32(SndBuf, COUNT,0, (char *)&lCount ,0);Fget32(SndBuf, USRNAME,0, (char *)sUsrName,0);…………………注:FML和VIEW类型buffer的API函数在后续的文章有详细的介绍和代码分析.

225633.ahxzyy2!rtmgr.200716.1.0: 06-03-2007: Tuxedo Version 8.1, 64-bit225633.ahxzyy2!rtmgr.200716.1.0: LIBTUX_CAT:328: ERROR: No space in Bulletin Board for Service Table225633.ahxzyy2!rtmgr.200716.1.0: LIBTUX_CAT:248: ERROR: System init function failed, Uunixerr = : msgctl: Error 0225633.ahxzyy2!tmboot.606478.1.-2: CMDTUX_CAT:825: ERROR: Process rtmgr at h8020 failed with /T tperrno (TPEOS - operating system error)


解决方案:调解参数MAXSERVICES

-t : 匹配C/S之间版本兼容问题(eg:6.5的client联8.1的server,就要配置)-n : 使用iport方式-m : 最少启动WSH的个数-M : 最大启动的WSH的个数-x : 每个WSH可以处理的请求数 ( M*x=maxwsclients )-T : 在与SERVER建立联接后,如果超过-T设置的时间没有活动的事物,就会自动短开连接(单位:分钟)

ULOG里报错如下:132223.hpl1!tmadmin.3526.1.-2: LIBTUX_CAT:334: ERROR: No BBL132313.hpl1!BBL.3538.1.0: 03-25-2003: Tuxedo Version 7.1 132313.hpl1!BBL.3538.1.0: gtrid x0 x3e7aa463 x10333: LIBTUX_CAT:328: ERROR: No space in Bulletin Board for Transaction Table132313.hpl1!BBL.3538.1.0: gtrid x0 x3e7aa463 x10333: LIBTUX_CAT:397: ERROR: Cannot allocate entry on GTT 字串9 解决方案:假如BBL启动失败是因为事务Transaction Table不能在BB中再分配空间时,处理方法如下:a. 备份相应的事务日志 TLOG : cp TLOG TLOG***b. 删除事务日志TLOG: rm TLOGc. 使用tmadmin登录到tuxedo系统中重新建一个日志设备,方法如下: $tmadmin>crdl -b 1000 -z//tuxedo/newweb/TLOG>crlog -m newweb

/Domain作为TUXEDO的一组件,使独立的TUXEDO应用可以进行通讯和共享资源。每个应用环境视作一个’domain’。这种结构有以下优点:

l       仍然可以访问远程其他域的数据

l       应用管理工作可以分散进行

l       资源可以根据计算的需要合适地分配

一个域可以跨越多台(个)机器或处理器。所有的客户端通过BB(Bulletin Board)了解所有的机器上提供的交易。BB间的一致性通过DBBL(Distinguished Bulletin Board Liaison)来保证。

通过/Domain,可以维护独立于主域的BB,可以设定那些交易可以响应其他机器。当一个远程域提出一个合法的交易请求时,/Domain将请求发送到被请求域并把返回送到请求进程。

以下介绍进行域间通讯时需修改的配置。

l       概念解释

l       配置过程

――环境变量

――ubbconfig
――dmconfig
――dmloadcf


使用TUXEDO组件/DOMAINS时,需要对管理配置作一些改变。在以下例子中,会创建一个独立的测试应用环境(DOMAINID是TEST),它可以读取/请求另一个应用的交易(ProdCust)的数据。

服务GWTDOMAIN(GWT)负责响应域间通讯。GWADM和DMADM是处理管理交易和域服务的管理服务。这些服务必须配置在UBBCONFIG文件中。配置信息必须在远程和本地应用环境中定义。

服务GWTDOMAIN通过TCP/IP协议与其他域进行通讯。物理上远程的域的应用位置是透明的。

服务GWTDOMAIN是双向的:可以处理远程域发来的请求也可以向远程域发出请求。

除UBBCONFIG外,配置/DOMAINS还需要一些信息。这些信息在DMCONFIG文件中。DMCONFIG的文本文件通过BDMCONFIG编译成二进制文件。

第一步:UBBCONFIG应作相应改动

       为/DOMAIN建立的新组应该和其他应用组隔离开。其一用于管理,其他是网关服务。

UBBCONFIG
*RESOURCES
IPCKEY                   49152
MAXACCESSERS      2
MAXSERVERS            25
MASTER                 SITE1
MODEL                   SHM
*MACHINES
class2                      LMID=SITE1
TUXDIR=”/usr/tuxedo”
APPDIR=”/usr/apps/atmapp”
TUXCONFIG=”/usr/apps/atmapp/atmapp.tux”
*GROUPS
LDMGRP                LMID=SITE1      GRPNO=20
LGWGRP                LMID=SITE1      GRPNO=30
#下一行用于‘prod’域
APP1                       LMID=SITE1     GRPNO=10
*SERVERS
DMADM                  SRVGRP=LDMGRP      SRVID=200
GWADM                 SRVGRP=LGWGRP      SRVID=310
GWTDOMAIN         SRVGRP=LGWGRP      SRVID=320
#下一行用于‘prod’域
CUSTOMER           CLOPT=”-A”      SRVGRP=APP1      SRVID=100
*SERVICES
#下一行用于‘prod’域
ProdCust


第二步:为域间请求创建DMCONFIG

       下文的ASCII数据存在的文件一般称为DMCONFIG,由此生成的二进制格式文件称为BDMCONFIG。以下的DMCONFIG存在于“TEST“域,用来请求远程的”prod“域的”ProdCust“交易。

DMCONFIG on TEST DOMAIN
*DM_LOCAL_DOMAINS
test               GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID=”TEST”
DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
*DM_REMOTE_DOMAINS
production          TYPE=TDOMAIN
DOMAINID=”prod”
*DM_TDOMAIN
prod                    NWADDR=”//lcspn1:3070”
NWDEVICE=”/dev/xti/tcp”
TEST                  NWADDR=”//lcspn2:3070”
NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
ProdCust
*DM_LOCAL_SERVICES


第三步:创建DMCONFIG指定对域外提供的交易

下文的DMCONFIG位于域’prod’,该域将向其他域提供可调用交易:ProdCust。

域‘prod’上的DMCONFIG

#本地域信息
*DM_LOCAL_DOMAINS
#LMID
production          GWGRP=LGWGRP
#域描述:TDOMAIN即TUXEDO DOMAINS
TYPE=TDOMAIN
#域的唯一标识符
DOMAINID=”prod”
#交易的日志
DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
#远程域信息
*DM_REMOTE_DOMAINS
test               TYPE=TDOMAIN
DOMAINID=”TEST”
*DM_TDOMAIN
#地址和设备名
prod                    NWADDR=”//lcspn1:3070”
NWDEVICE=”/dev/xti/tcp”
TEST                  NWADDR=”//lcspn2:3070”
NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
#远程域可以使用的交易
ProdCust


/DOMAIN进程需要额外的环境变量去访问/DOMAINS配置信息

export BDMCONFIG=/usr/apps/atmapp/atmapp.bdm


第五步:编译ubbconfig

本过程是从两个域中相同的UBBCONFIG生成二进制文件TUXCONFIG。在本例中,UBBCONFIG的信息位于’ubbconfig’。

tmloadcf -y ubbconfig


第六步:编译dmconfig

本过程是创建二进制DOMAINS配置文件,BDMCONFIG,在两个域中相同;而两者都有的文件‘dmconfig’内容是不同的。

dmloadcf -y dmconfig




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论