通过wtc、jolt进行tuxedo与weblogic通信开发
更新时间:2024-02-01 08:46:01 阅读量: 教育文库 文档下载
- 通过车牌号定位车位置推荐度:
- 相关推荐
标题:通过wtc、jolt进行tuxedo与weblogic通信开发
[评论]
作者:李振嘉(dev2dev ID:lizhenjia)
(一)摘要
bea tuxedo与weblogic作为业界优秀的交易与应用服务器中间件产品,在电信,银行,金融等领域广泛应用,通常由tuxedo处理系统的核心业务,weblogic将业务应用扩展到internet平台,实现电子商务,由weblogic调用tuxedo的服务或者由tuxedo的服务调用通过weblogic部署的ejb,所以tuxedo与weblogic之间的互连通信会经常遇到,本文通过2个例子介绍tuxedo与weblogic通信的配置与开发,两个例子分别通过wtc(weblogic tuxedo connector)、jolt实现weblogic与tuxedo通信的配置与开发.本文所有例子程序与配置均在Sun Solaris,weblogic8.1,tuxedo8.0平台上进行,如在windows等其他平台开发配置方法大同小异;另外为了减少篇幅文中涉及的例子代码没有全部罗列,只选择粘贴了关键部分的代码.
(二)通过wtc进行tuxedo与weblogic通信的配置与开发
1)域间通信以及wtc介绍
Tuxedo的域间通信进程介绍
Wtc是tuxedo通过域间通信实现的,所以需要tuxedo启动用于域间通信的进程,介绍wtc之前先介绍以下几个域间通信的进程.
*DMADM(DOMAIN ADMINISTRATOR SERVER)
管理域的server,在运行时管理BDMCONFIG,对已登记的gateway group提供支持,在tuxedo系统中,只能有一个DMADM进程,且不能对它采用MSSQ,不能有REPLYQ.
*GWADM(GATEWAY ADMINISTRATOR SERVER)
管理域的域网关进程,在运行时可以对某一组域网关进行管理,主要从DMADM那里取得域的配置信息,并对域网管进程及跨越域的全局事务的LOG文件进行管理.
*GWTDOMIN(GATEWAY PROCESS)
处理域之前的互操作,使本地域和调用远程域可以互相调用彼此的service,其中GMADM和GWTDOMAIN必须在一个组中,一个tuxedo应用可以有多个GWADM,GWTDOMAIN对,一个组只能有一个
GMADM,GWTDOMAIN对,但一个tuxedo应用只能有一个DMADM,DMADM可以在如何一个组中,一个本地域可以和多个远程域实现互操作.
Wtc介绍
Wtc(weblogic tuxedo connector)是weblogic server的一个组成部分,可以实现tuxedo和weblogic之间的应用集成,为weblogic和tuxedo提供了双向的互操作性,即tuxedo service可以调用在weblogic上部署的ejb,在weblogic上部署的ejb可以调用tuxedo的service.
2)Tuxedo方面需要进行的工作
修改并编译ubb文件
1) 在ubb文件*GROUPS节点中增加如下3个tuxedo Group:
DMGroup
LMID=simple GRPNO=2 OPENINFO=NONE
DMGroup
LMID=simple GRPNO=3 OPENINFO=NONE
WSGroup
LMID=simple GRPNO=4 OPENINFO=NONE
2)在ubb文件*SERVERS节点中增加如下3个tuxedo server:
DMADM
SRVGRP=DMGroup SRVID=22230
GWADM
SRVGRP=GWGroup SRVID=22340
GWTDOMAIN
SRVGRP=GWGroup SRVID=22350
其中GWADM和GWTDOMAIN应该在同一个组中,保存ubb文件并按如下完成编译:
tmloadcf ubb_filename
之后tmboot-y启动tuxedo server,如果启动以上3个server时报类似Application initialization failure的启动失败的提示信息,那么注意查看tuxedo的ULOG日志文件,通过日志的提示排除错误,这里常见的一个错误是没有在系统环境变量中定义
BDMCONFIG或者指定该文件路径错误.(关于环境变量的修改见下文).
增加并编译dm文件
dm文件是tuxedo进行域间通信时的配置文件,tuxedo与weblogic通过wtc通信是通过域间通信实现的,所以dm文件需要创建,dm文件通常可以存放在ubb文件所在的路径下.
Dm需要做的配置如下:
*DM_LOCAL_DOMAINS
tuxedo_domain GWGRP=GWGroup
TYPE=TDOMAIN
DOMAINID=billing
DMTLOGDEV=\
*DM_REMOTE_DOMAINS
weblogic_domain TYPE=TDOMAIN
DOMAINID=weblogic
*DM_TDOMAIN
tuxedo_domain NWADDR=\
NWDEVICE=\
weblogic_domain NWADDR=\
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
fml32_test RNAME=\
*DM_LOCAL_DOMAINS定义本地tuxedo域的信息,分别定义该域所在的组,域类型,域的唯一标识,域间通信时日志的全路径,其中GWGRP, DOMAINID的值要与ubb文件中的定义匹配.
*DM_REMOTE_DOMAINS定义远程weblogic域的信息,分别定义域类型,域的唯一性标识,该id标识需要与在weblogic server中的配置名称吻合,否则通信将会失败,关于在weblogic中的相应配置下文将作详细描述.
*DM_TDOMAIN定义在DM_LOCAL_DOMAIN中已经说明的本地域和在DM_REMOTE_DOMAINS中已经说明的远程域的具体的通信ip地址以及通信端口,其中NWDEVICE指定tuxedo发布的server通信进程文件所在的路径.
*DM_REMOTE_SERVICES定义当前域需要调用远程域的服务名称,本例中的服务作为被调用服务,所以此处可以为空.
*DM_LOCAL_SERVICES定义当前域对外发布的tuxedo service名称,可以通过RNAME重新命名service.
在以上NWADDR中指定的端口一定不能是已经被占用的端口,否则通信将失败,之前应该用netstat命令查询得到空闲的端口.
保存dm文件并按如下完成编译:
dmloadcf dm_filename
修改系统环境变量
在系统环境变量中增加:
export BDMCONFIG=$HOME/your_path/bdmconfig
其中bdmconfig文件为dmloadcf dm_filename编译之后生成的2进制配置文件.
编写基于tuxedo的程序以及makefile.
说明
Tuxedo支持string,carry,view,view32,fml,fml32等数据缓冲区,其中fml32类型相对复杂且比较常用,本例子采用fml32数据缓冲区开发,首先需要编写fml32数据缓冲区的定义文件,包括fml32数据缓冲区各个字段的名称已经长度等等,并将该文件生成相应的c语言.h头文件,在应用程序中需要包含该头文件,这样应用程序中即可以使用fml32数据缓冲区, fml32类型通常在开发数据库应用程序的时候比较常用,以下的例子完成的功能是:根据输入的学生学号从数据库中查询得到该学生的姓名和年龄,其实输入和输出参数采用fml32类型.
编写并编译fml32数据缓冲区定义文件
定义fml32数据缓冲区文件student_fld文件如下:
*base 10000
# name number type flags comments
student_id 1 long - 学生学号
student_name 2 string - 学生姓名
student_age 3 long - 学生年龄
student_id等3项就是自定义fml32类型的域字段,其中每一个字段都对应一个number,这些number有一个公共的起始值,通过*base 10000定义.
定义之后通过mkfldhdr32 student_fld编译该文件,之后生成student_fld.h头文件,在应用程序中将引用该文件.
编写源程序以及定义表
定义t_student表,其中id表示学号,name表示学生姓名,age定义表示姓名.
进入oracle sqlplus,键入:
create table t_student (id number(10), name varchar2(20), age number(3));
源程序文件wtc_jolt.pc(该程序通过pro*c文件访问数据库oracle数据库):
#include
#include
#include
#include
#include \
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
EXEC SQL BEGIN DECLARE SECTION;
char sConnStr [100];
EXEC SQL END DECLARE SECTION;
argc = argc;
argv = argv;
memset(sConnStr, 0x00, sizeof(sConnStr));
strcpy(sConnStr, “数据库连接串”);
EXEC SQL Connect :sConnStr;
if (sqlca.sqlcode)
{
userlog(\连接数据库失败,错误号码:%d,详细原因:%s \
return -1;
}
}
#ifdef __cplusplus
extern \
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
fml32_test(TPSVCINFO *rqst)
#else
fml32_test(rqst)
TPSVCINFO *rqst;
#endif
{
FBFR32 *recebuf = NULL;
FBFR32 *sendbuf = NULL;
FLDLEN32 recebuflen = 0;
EXEC SQL BEGIN DECLARE SECTION;
long lStudentId = 0;
char sName[15] = \
long lAge = 0;
EXEC SQL END DECLARE SECTION;
recebuf = (FBFR32 *)rqst->data;
if ((sendbuf = (FBFR32 *)tpalloc(\
{
tpterm();
exit(-1);
}
recebuflen=0;
Fget32(recebuf, student_id, 0, (char *)&lStudentId, &recebuflen);
EXEC SQL Select age, name Into :lAge, :sName
From t_student
Where student_id = :lStudentId;
if (sqlca.sqlcode)
{
userlog(\查询失败,code=%d,detail=%s \
exit(-2);
}
Fchg32(sendbuf, student_age, 0, (char *)&lAge, 0);
Fchg32(sendbuf, student_name, 0, sName, 0);
tpreturn(TPSUCCESS , 0, (char *)sendbuf, 0, 0);
}
编写makefile文件
.SUFFIXES:.pc .c
CC=cc
TUXINCLUDE=$(TUXDIR)/include
ORAINCLUDE=$(ORACLE_HOME)/precomp/public
WORKPATH=$(HOME)/../../...
APPPATH=$(HOME)/bin
TARGET=wtc_jolt
all: $(TARGET)
-@echo \
wtc_jolt:wtc_jolt.c
buildserver -f wtc_jolt.o -o wtc_jolt -s \
.pc.c:
proc iname=$<$(PROCPLSFLAGS) oname=$*.c parse=full hold_cursor=no release_cursor=yes include=$(TUXINCLUDE) include=$(ORAINCLUDE)
$(CC) -I$(ORAINCLUDE) -I$(TUXINCLUDE) -c $(ORACFLAGS) $*.c
将例子文件发布成tuxedo server和service.
通过makefile将wtc_jolt.pc编译成可执行文件wtc_jolt之后.
(一)修改tuxedo ubb配置文件.
1)在 *server节点中添加:
wtc_jolt SRVGRP=GROUP SRVID=1100
其中GROUP是tuxedo应用所在的组, SRVID是该server的标识id,注意不要与其他SRVID重复,wtc_jolt是刚刚编译生成的可执行文件名字,这样该文件就被发布为tuxedo server.
2)在*service节点中添加:
fml32_test
其中fml32_test是wtc_jolt.pc文件中的函数名字,这样该函数就被发布为属于server:wtc_jolt中的一个tuxedo service.
3)编译修改之后的ubb文件:
tmloadcf ubb_filename
(二)修改tuxedo dm配置文件.
1)在*DM_LOCAL_SERVICES节点中添加:
fml32_test RNAME=\
发布fml32_test service,使该service可以被其他域中的服务调用.
2)编译修改之后的dm文件:
dmloadcf dm_filename
以上配置和开发工作完成之后tuxedo方面的工作完成,tmboot ?y启动tuxedo,如有以下提示信息,tuxedo方面的工作宣告成功.
1) exec DMADM -A :
process id=28863 ... Started.
exec GWADM -A :
process id=28864 ... Started.
exec GWTDOMAIN -A :
process id=28865 ... Started.
以上信息说明域间通信进程启动成功!
2) exec wtc_jolt -A :
process id=28950 ... Started.
以上信息说明发布的server进程启动成功!
此时键入命令tmadmin, 键入子命令psc, 如有以下提示信,说明发布service成功.
Service Name Routine Name Prog Name Grp Name ID Machine # Done Status
---------------------------------------------------------------------
fml32_test fml32_test wtc_jolt GROUP 1100 simple 0 AVAIL
进行到这里tuxedo方面所有的工作已经完成,下面进入weblogic方面的工作.
3)Weblogic方面需要进行的工作.
创建tuxedo fml(32) 数据缓冲区定义文件对应的java类文件
本文例子用到tuxedo fml32数据缓冲区,所以首先要创建该fml32数据缓冲区定义文件对应的java描述文件的类文件,将前面定义的文件student_fld.
1) 执行weblogic环境变量setWLSEnv.sh,使weblogic环境变量生效.
2) 运行: java weblogic.wtc.jatmi.mkfldclass32 student_fld生成student_fld.java描述文件.
3) 运行: javac ?d student_fld.java生成student_fld.class文件.
4) 该类文件的存放路径一定可以被weblogic识别,即保存在weblogic启动后CLASSPATH的路径中,否则在后面配置wtc resource时会失败.
配置weblogic wtc service
进入weblgoic console,mydomain->services->wtc->Configure a new WTC service…
Name属性键入: WTC_Service,create保存设置,此时WTC_Service将生成local tuxedo access等若干子项,在下面将一步一步配置这些项目.
配置local tuxedo access
mydomain->services->wtc-> WTC_Service-> Configure a new local tuxedo access point…
依次填写Access Point: Local_Wls_Domain
Access Point ID: weblogic
Network Address: //weblogicserver_ip:port
注意:
1) Access Point ID的值应该与在tuxedo dm文件中*DM_REMOTE_DOMAINS节中指定的domainid相同.
2) Network Address中指定的通信端口一定是weblogic server上未被占用的端口.
以上信息填写完成后点击create保存.
配置remote tuxedo domain
mydomain->services->wtc-> WTC_Service-> Configure a new remote tuxedo access point…
依次填写Access Point: Remote_Tuxedo_Domain
Access Point ID: billing
Local Access Point: Local_Wls_Domain
Network Address: //tuxedoserver_ip:port
注意:
1) Access Point ID的值是远程tuxedo domain 的domain_id.
2) Local Access Point的值是上面配置的local tuxedo access point的名字.
以上信息填写完成后点击create保存.
导入tuxedo services
mydomain->services->wtc-> WTC_Service->Imported services->
Configure a new imported service…
Resource Name: fml32_test
Local Access Point: Local_Wls_Domain
Remote Access Point List: Remote_Tuxedo_Domain
Remote Name: fml32_test
注意:
1) Local Access Point是上面配置的local tuxedo access point的名字.
2) Remote Access Point List是上面配置的remote tuxedo access point的名字.
3) Remote Name是可供weblogic调用的远程tuxedo发布的service名字,即在
Tuxedo dm文件的*DM_LOCAL_SERVICES节点中发布的service名字.
配置wtc resource
mydomain->services->wtc-> WTC_Service->resources->
Configure a new Resource….
FldTbl32 classes: student_fld
注意:
1)resource定义fml(32),view(32)等数据缓冲区的类文件定义,其中student_fld就是上面编译得到的类,如果源文件包含在包中那么要标明包名称在内的全路径,如:
com.bea.wtc.test.classname
2)其中fml和fml32类型的java类在这里要分别指定,不能通用,view(32)也是一样.
以上信息填写完成后点击create保存,至此wtc service全部配置完成,单击wtc_service的Target and deploy标签,选择server,apply以上应用.
编写通过wls访问tuxedo service的程序
为了减少篇幅例子代码没有全部罗列,只选择粘贴了代码中的关键部分.
编写访问tuxedo service的ejb
关键函数介绍
创建本地接口文件,远程接口文件以及bean文件,公布以下远程方法:
1)public CallDescriptor Tpacall(String service, TypedFML32 in_params)
throws TPException, TPReplyException, RemoteException;
2)public TypedFML32 Tpgetrply(CallDescriptor cd)
throws TPException, TPReplyException, RemoteException;
3)public TypedFML32 Tpcall(String service_name, TypedFML32 in_params)
throws TPException, TPReplyException, RemoteException;
Tpcall : 同步调用tuxedo service.
Tpacall : 异步调用tuxedo service.
Tpgetrply: 等待异步调用service的返回结果.
关键函数代码
import weblogic.wtc.jatmi.Reply;
import weblogic.wtc.jatmi.TypedFML32;
import weblogic.wtc.jatmi.TPException;
import weblogic.wtc.jatmi.TPReplyException;
import weblogic.wtc.gwt.TuxedoConnection;
import weblogic.wtc.gwt.TuxedoConnectionFactory;
import weblogic.wtc.jatmi.Ferror;
import weblogic.wtc.jatmi.CallDescriptor;
import weblogic.wtc.jatmi.ApplicationToMonitorInterface;
private TuxedoConnection tuxConn = null;
函数setUpConnection
public TuxedoConnection setUpConnection() throws TPException
{
Context ctx = null;
TuxedoConnectionFactory tcf = null;
try
{
ctx = new InitialContext();
tcf= (TuxedoConnectionFactory)ctx.lookup(TUXEDOCONN_JNDI_NAME);
}
catch (NamingException ne)
{
throw new TPException(TPException.TPENOENT, \
}
try
{
tuxConn = tcf.getTuxedoConnection();
}
catch (TPException e)
{
throw new TPException(TPException.TPENOENT, \
}
return tuxConn;
}
函数Tpcall
public TypedFML32 Tpcall(String service_name, TypedFML32 in_params) throws TPException, TPReplyException
{
Reply tuxReply = null;
TypedFML32 tuxRtn = null;
try
{
if (tuxConn == null) tuxConn = this.setUpConnection();
}
catch (TPException e)
{
System.out.println(\
throw e;
}
try
{
tuxReply = tuxConn.tpcall(service_name, in_params, 0);
}
catch (TPReplyException tre)
{
System.out.println(\
throw tre;
}
catch (TPException te)
{
System.out.println(\
throw te;
}
catch (Exception ee)
{
System.out.println(\
throw new TPException(TPException.TPESYSTEM, \
}
tuxRtn = (TypedFML32)tuxReply.getReplyBuffer();
return tuxRtn;
}
函数Tpacall
public CallDescriptor Tpacall(String service_name, TypedFML32 in_params) throws TPException, TPReplyException
{
CallDescriptor tuxRtn = null;
try
{
tuxConn = this.setUpConnection();
}
catch (TPException e)
{
System.out.println(\
throw e;
}
try
{
tuxRtn=tuxConn.tpacall(service_name,in_params, ApplicationToMonitorInterface.TPNOTIME);
}
catch (TPReplyException tre)
{
System.out.println(\
throw tre;
}
catch (TPException te)
{
System.out.println(\
throw te;
}
catch (Exception ee)
{
System.out.println(\
throw new TPException(TPException.TPESYSTEM, \
}
return tuxRtn;
}
函数Tpgetrply
public TypedFML32 Tpgetrply(CallDescriptor cd) throws TPException, TPReplyException
{
Reply tuxRtn = null;
TypedFML32 result = null;
try
{
if (tuxConn == null) tuxConn = this.setUpConnection();
}
catch (TPException e)
{
System.out.println(\
throw e;
}
try
{
tuxRtn = tuxConn.tpgetrply(cd, ApplicationToMonitorInterface.TPNOTIME);
}
catch (TPReplyException tre)
{
System.out.println(\
throw tre;
}
try
{
result = (TypedFML32)tuxRtn.getReplyBuffer();
}
catch (Exception e)
{
System.out.println(\
result = null;
}
tuxConn.tpterm();
return result;
}
关于避免调用超时
有时Tuxedo service需要做时间较长的处理,超过了tuxedo默认的调用超时
时间,为了避免超时需要使客户端一直阻塞知道服务器端service返回结果;在传统tuxedo的c语言程序客户端可以指定tp(a)call函数的第6个参数flag为TPNOTIME,此时客户端如果有阻塞条件存在,客户端会一直阻塞即使超时也不返回;但通过weblogic的java客户端如果想要达到这个目的,如果采用异步tpacall调用,不仅仅要在tpacall中指定flag值为ApplicationToMonitorInterface.TPNOTIME,在tpgetrply等待结果时也同样需要指定第2个参数为ApplicationToMonitorInterface.TPNOTIME,否则仅在tpacall中指定不能达到避免超时的目的.
编写ejb客户端
关键函数介绍:
Public int selectService ();
连接weblogic server,调用具体的函数调用tuxedo service.
Public int callTestService(String service_name);
根据输入参数学号,调用tuxedo service,获得返回结果学生姓名和年龄.
关键函数代码
函数selectService
import weblogic.wtc.jatmi.Ferror;
import weblogic.wtc.jatmi.TypedFML32;
import weblogic.wtc.jatmi.CallDescriptor;
Public int selectService ()
{
try
{
…连接weblogic server…………
obj = ctx.lookup(ejb的jndiname);
}
catch (Exception e)
{
…………………
}
wtcHome=(WtcInstanceHome)javax.rmi.PortableRemoteObject.narrow(obj, WtcInstanceHome.class);
try
{
wtcRemote = wtcHome.create();
}
catch (Exception e)
{
………….
}
callTestService(service_name);
try
{
wtcRemote.remove();
}
catch (Exception e)
{
………………
}
}
函数callTestService
public String callTestService (String service_name)
{
CallDescriptor tuxRtn = null;
TypedFML32 inParams = null, tuxResult = null;
try
{
//创建fml32缓冲区java描述类的实例
inParams = new TypedFML32(new student_fld());
//填写输入参数:学号
inParams.Fchg(student_fld.student_id , 0, getStudentId());
}
catch (Ferror e)
{
……
}
try
{ //异步调用tuxedo service.
tuxRtn = wtcRemote.Tpacall(service_name, inParams);
}
catch (Exception e)
{
………
}
try
{ //等待异步调用的service返回结果.
tuxResult = wtcRemote.Tpgetrply(tuxRtn);
}
catch (Exception e)
{
………
}
try
{
//得到学生的姓名和年龄…
stuName = (String)tuxResult.Fget(student_fld.student_name, 0);
stuAge = (Integer) tuxResult.Fget(student_fld.student_age, 0);
}
catch (Ferror e)
{
………
}
………
}
(三)通过jolt进行tuxedo与weblogic通信的配置与开发
1)jolt介绍
Jolt是bea的一个单独的产品,它提供java编程接口,可以在java程序中使用jolt提供的类,使tuxedo应用框架扩展到internet和java客户端.
2)Tuxedo方面需要进行的工作
修改并编译ubb文件
1)在ubb文件*GROUPS节点中增加如下2个tuxedo group:
JSLGRP LMID=simple GRPNO=5 OPENINFO=NONE
JREPGRP LMID=simple GRPNO=6 OPENINFO=NONE
2)在ubb文件*SERVERS节点中增加如下2个tuxedo server:
JSL
SRVGRP=JSLGRP SRVID=22210 CLOPT=\
JREPSVR
SRVGRP=JREPGRP SRVID=22220 CLOPT=\
修改完成后编译ubb文件:
tmloadcf ubb_filename
tmboot -y启动tuxedo server后出现类似以下的信息说明tuxedo配置成功.
exec JSL -A -- -n //10.13.195.69:9178 -m 5 -M 10 -x 5 :
process id= 22210... Started.
exec JREPSVR -A -- -W -P /data2/beasoftware/bea/tuxedo8.0/udataobj/jolt/repository/jrepository :
process id=22220... Started.
注意:
1) 当通过jolt实现tuxedo,weblogic互连时,JSL,JREPSVR是在tuxedo中必须发布启动的2个server.
2) 在以上JSL 的CLOPT参数中指定的port一定不能是已经被占用的端口,否则JSL启动将失败,之前应该用netstat命令查询得到空闲的端口.
3)在以上JREPSVR中$(TUXDIR)是系统的tuxedo主目录,如:data1ea uxedo8.0
在jrepository中注册tuxedo service
打开Tuxedo安装目录下的udataobj/jolt/子目录下RE.html文件,其中包含java applet,可通过appletviewer RE.html启动该文件,该applet可以接收用户输入,并在jrepository中注册tuxedo service以及service的输入输出参数等等,只有注册之后才能通过jolt访问tuxedo service.
Appletviewer RE.html启动界面如下:
键入JSL server绑定的ip,port(在ubb文件中指定)之后敲回车键登录,此时界面的services和packages按键处于有效状态,界面如下:
可以点击packages按钮创建包,一个包中可以包含若干个service,需要发布供客户端调用的service,所以在之前要创建包含service的package,界面如下:
创建完成package,点击back按钮,单击service,指定属于该包的之前定义的tuxedo service:fml32_test,创建它的输入参数student_id以及输出参数student_name,student_age等等,界面如下:
以上工作完成后sevice fml32_test已经注册成功,所发布的service可以供jolt客户端调用,所有tuxedo方面的工作全部完成.
3)Weblogic方面需要进行的工作
修改weblogic server环境变量配置文件
在weblogic环境变量文件的classpath中加入包jolt.jar, joltadmin.jar, joltjse.jar, joltasp.jar, joltwls.jar的全路径,如CLASSPATH=data??ea uxedo8.0udataobjjoltjolt.jar;data??ea uxedo8.0.....,其中这几个jar包存放在tuxedo安装路径下的udataobjjolt子目录下,以上路径以及环境变量文件的修改视实际安装情况而定.
配置weblgoic console中的项目
启动weblogic server,打开控制台:http://localhost:port/console
配置startup class, shutdown class
Mydomain->deployments->startup & shutdown->
Configure a new Startup Class...
ClassName: bea.jolt.pool.servlet.weblogic.PoolManagerStartUp
选择target and deploy标签,指定server, apply.
Mydomain->deployments->startup & shutdown->
Configure a new ShutDown Class...
ClassName: bea.jolt.pool.servlet.weblogic.PoolManagerShutDown
选择target and deploy标签,指定server, apply.
配置jolt connection pool Mydomain->services->jolt->
Configure a new Jolt Connection Pool...
选择addresses标签,指定Primary Addresses的值为//tuxedoserver_id:port
其中这里的ip和port是在tuxedo ubb配置文件中指定的JSL server的绑定ip和通信端口.完成后选择target and deploy标签,指定server, apply.
至此weblogic console方面的配置工作全部完成,此时进入tuxedo server服务器,键入命令tmadmin,pclt,看到类似如下信息说明tuxedo 和weblogic连接正常,大功告成!
LMID User Name Client Name Time Status Bgn/Cmmt/Abrt
---------------------------------------------------------------------------------------------------
lizhj User.0@5178 JSH 2:13:12 IDLE 0/0/0 lizhj User.0@5178 JSH 2:13:12 IDLE 0/0/0 lizhj User.0@5178 JSH 2:13:12 IDLE 0/0/0
………………………………………………………….
编写基于jolt的java客户端访问程序
为了减少篇幅例子代码没有全部罗列,只选择粘贴了代码中的关键部分.
import bea.jolt.pool.*;
import bea.jolt.pool.servlet.*;
Result result = null;
SessionPool joltSession = (SessionPool)b_mgr.getSessionPool(\
DataSet request = new DataSet();
request.setValue(\填写fml32_test service的输入参数.
try
{
result = joltSession.call(\
}
catch(Exception e)
{
….
}
String name = new String();
Integer age = new Integer();
while (true)
{
name = (String)result.getValue(\
age = (Integer)result.getValue(\
//以上2行程序读取tuxedo service返回的姓名和年龄域的值.
if ((name != null) && (age != null) && (address != null))
{
System.out.println(“姓名:” + name );
System.out.println(“年龄:” + age );
recordcount++;
}
else
{
break;
}
}
说明:一个学号只对应唯一的一个学生所以,以上程序完全可以不用while循环,不过有些时候根据一个输入条件可以查询得到一个记录集合而不是唯一的一条记录,所以需要循环取得记录集合中每一条记录的数据,以上程序循环fml32缓冲区中学生姓名域和学生年龄域的下标,从而可以得到完整的记录集数据,在此例中没有必要,在这里使用while只是提供一个获取记录集的解决办法.
(四)总结
工作原因需要进行tuxedo和weblogic的通信开发,由于缺少相关资料所以当初进展缓慢,工作完成之后将我对jolt,wtc的开发配置的心得做个小结,编写了这篇文章,希望对大家有所帮助,文章中例子在Sun Solaris,weblogic8.1,tuxedo8.0调试通过,任何问题请联系nefuicec@21cn.com或lizhj@mail.csoft.com.cn.
TUXEDO与WEBLOGIC通过WTC进行互连的配置
(作者:徐春金)
BEA公司的TUXEDO,WEBLOGIC作为最优秀的中间件产品,在银行、电信、金融等行业广泛使用,通常采用TUXEDO实现系统的核心业务,用WEBLOGIC做为系统扩展到
INTERNET的平台,实现电子商务,由WEBLOGIC调用TUXEDO上的服务,所以TUXEDO与WEBLOGIC之间的互连经常遇到。
下面通过一个例子介绍TUXEDO与WEBLOGIC通过WTC进行连接的配置方法。 WEBLOGIC与TUXEDO的互连有两中方式,通过JOLT或通过WTC(WEBLOGIC TUXEDO CONNECTOR)。它们都是BEA的产品,WTC不仅能让WEBLOGIC调用TUXEDO中的SERVICE,而且能让TUXEDO调用WEBLOGIC中的EJB;而JOLT只能让WEBLOGIC调用TUXEDO. 但JOLT可以使TUXEDO与WEBSPERE等其他应用 服务器相连,而WTC只能用于WEBLOGIC与TUXEDO之间进行互连。 一、WTC说明
(1)WEBLOIGIC5.1无法通过WTC与TUXEDO连接. (2)WEBLOGIC6.0与TUXEDO连接时,要安装WTC软件包.
(3)WTC已集成在在EBLOGIC6.1中,只要配置一下就可以了,不用单独安装WTC软件包. (4)目前WTC只支持TUXEDO6.5,TUXEDO8.0两个版本,不支持TUXEDO7.1版本. (5)目前WTC有两个版本, Windows版本支持2000/NT,UNIX为统一版本. (6)WTC可从http://commerce.bea.com/downloads/tuxedo.jsp下载,目前的版本为1.0. 二、WTC安装过程
(1) WEBLOGIC与TUXEDO必须先安装好.
(2)WTC要求在JAVA环境下安装,可在命令行下,运行weblogic主目录下config/EXAMPLE/setEnv.sh(NT/2000下为setenv.cmd)配置JAVA环境 (3)在DOS命令行下执行安装程序WTC_10_win.exe。按提示操作就可以.
注意:如果在WINDOW下安装,到COPY文件那一步时,不会执行,但提示安装成功,实际是假的。所以应在DOS命令行下安装. 三、WTC配置说明
TUXEDO与WEBLOGIC之间通过DOMAIN方式实现互相调用,在这个例子中有两个DOMAIN:TUXEDO所在的DOMAIN名为TDOM1, WEBLOGIC所在的 DOMAIN名为TDOM2。TDOM1上有TOUPPER它是一个TUXEDO SERVEICE,TDOM2上有TOLOWER它是一个EJB,
下面以WTC安装带的例子simpapp(在WTC安装目录的examples/wtc/atmi/simpapp下)说明配置过程:
TUXEO版本: TUXEDO65 WEBLOGIC版本: WEBLOGIC6.0 TUXEO安装目录: D:\\TUXEDO65 WEBLOGIC安装目录: D:\\WEBLOGIC 操作系统: WIN2000
例子目录: D:\\SIMPAPP(把WTC安装目录的examples/wtc/atmi/simpapp目录COPY到D:\\SIMPAPP)
服务器名: DEMOSERVER
WTC安装目录: D:\\WEBLOGIC\\WTC1.0 四、TUXEDO要做的配置
(1)修改D:\\SIMPAPP\\SETENV.CMD为: set TUXDIR=d:\\tuxedo65
set WSNADDR=//DEMOSERVER:8888 set APPDIR=d:\\simpapp
set PATH=%TUXDIR%\\bin;%APPDIR%;%PATH% set TUXCONFIG=%APPDIR%\\tuxconfig set BDMCONFIG=%APPDIR%/dbmconfig (2)修改D:\\SIMPAPP\\UBBDOMAIN为: *RESOURCES IPCKEY 123456 DOMAINID simpapp MASTER simple MAXACCESSERS 10 MAXSERVERS 5 MAXSERVICES 10 MODEL SHM LDBAL N *MACHINES
DEMOSERVER LMID=simple APPDIR=\
TUXCONFIG=\ TUXDIR=\ *GROUPS GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE *SERVERS DEFAULT: CLOPT=\
simpserv SRVGRP=GROUP1 SRVID=1 *SERVICES
TOUPPER
(3)修改D:\\SIMPAPP\\DOM1CONFIG:
修改dom1config,加入TLOG的路径和AUDITLOG的路径。然后修改TDOM1的NWADDR=\为TUXEDO的IP和端口,TDOM2的 NWADDR=\为WEBLOGIC的IP和端口。 *DM_RESOURCES VERSION=U22 *DM_LOCAL_DOMAINS TDOM1 GWGRP=GROUP2 TYPE=TDOMAIN DOMAINID=\ BLOCKTIME=20 MAXDATALEN=56 MAXRDOM=89 TLOG=\
AUDITLOG=\ *DM_REMOTE_DOMAINS TDOM2 TYPE=TDOMAIN DOMAINID=\ *DM_TDOMAIN
TDOM1 NWADDR=\ TDOM2 NWADDR=\ *DM_REMOTE_SERVICES TOLOWER RDOM=\ (4) tmloadcf -y ubbdomain (5) mloadcf -y dom1config
(6)buildserver -o simpserv -f simpserv.c -s TOUPPER
(7)将examples/wtc/atmi/simpapp/simpserv下的tolower.c 拷贝到D:\\SIMPAPP,并执行buildclinet -v -f tolower.c -o tolower 五、WEBLOGIC要做的配置
(1)修改weblogic目录下config/examples/setExamplesEnv.cmd及startExamplesServer.cmd,在CLASSPATH中加入:
d:\\weblogic\\wtc1.0\\lib/jatmi.jar。执行setExamplesEnv.cmd
(2)修改bdmconfig.xml
修改中的directory]\\weblogic\\wtc\\gwt\\wtc_config_1_0.dtd(WLS60)
:[WTC
installation
修改TDOM1和TDOM2的NWADDR和TUXEDO中的dom1config中的一致
如果tuxedo为6.5版本则在 \
SYSTEM
(4)执行java weblogic.wtc.gwt.WTCValidateCF bdmconfig.xml监测xml是否正确。 (5)在D:\\SIMPAPP下执行build命令,然后在D:\\weblogic\\wtc1.0\\examples\\simpserv下执行build命令 (6)启动welogic
(7)察看wtc_tolower.jar、wtc_toupper.jar是否deploy成功 (8)建立一个WEBLOGIC StartUp Class:
classname为 weblogic.wtc.gwt.WTCStartup 参数BDMCONFIG=D:\\SIMPAPP\\bdmconfig.xml,并设置其TARGET为EXAMPLESERVER (9)建立一个WEBLOGIC ShutDown Class:
classname为weblogic.wtc.gwt.WTCShutdown,并设置其TARGET为EXAMPLESERVER (10)重新启动weblogic,并注意WEBLOGIC的启动日志看StartUp Class启动过程是否成功,失败会报错,成功没有提示信息 如果失败没有检查config.xml中是否为
在d:/simpapp下执行run.cmd,这是WEBLOGIC 做CLIENT端调用Toupper ejb,由Toupper ejb调用TUXEDO的SERVICE:TOUPPER 在d:/simpapp下执行run.cmd,这是TUXEDO做CLIENT端调用WEBLOGIC中的Tolower ejb, 八、如果是WEBLOGIC6.1 TUXEDO的配置不变 ClassName=\ 为 WEBLOGIC中从(2)开始配置.其中:DMCONFIG.XML中的,因为WEBLOGIC6.1中找不到wtc_config_1_0.dtd,可从WEBLOGIC6.1拷贝一个到WEBLOGIC6.1的安装目录下: 如D:\\WEBLOGIC6.1,并在DMCONFIG.XML指定它的路径 如果失败,可设置weblogic.wtc.gwt.WTCStartup的跟踪选项,即把它的参数设置为: BDMCONFIG=D:\\simpapp\\bdmconfig.xml,TraceLevel=20000 并请查看WEBLOGIC,TUXEDO的日志.做相应的处理。
正在阅读:
通过wtc、jolt进行tuxedo与weblogic通信开发02-01
高中生物科普知识竞赛题09-01
1周末告家长书03-05
金属材料及热处理课后习题参考答案11-22
数字电路答案第三章 103-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- weblogic
- 通过
- 通信
- 进行
- tuxedo
- 开发
- jolt
- wtc
- 福师《地方政府学》在线作业
- 重要空白凭证管理讲义 - 图文
- 人寿个险新人手册(总) - 图文
- JAVA练习题d4
- 第三届IT文化节通知 - 班级 - 图文
- 2011年国家公务员行测:常识判断六大热点汇总
- 尔雅美术鉴赏习题答案
- 事业单位个人述职报告
- 中国高等教育学会历届优秀高等教育学博士学位论文名单
- 二年级看图写话教案
- 江苏省2017年九年级《英语》自主招生模拟试题及答案
- 各种物质饱和蒸汽压的算法
- 施工组织设计方案1
- 直营门店POS实用操作手册(V3.0)
- 南京林业大学2011年拟录取研究生导师安排
- 安规复习题
- 西南财经大学人才培养方案质量保障体系
- 生物竞赛试题选编一:生命的物质基础
- 施工组织设计-8(医院)
- 最全学生良好行为习惯养成活动记录表