通过wtc、jolt进行tuxedo与weblogic通信开发.docx

上传人:小飞机 文档编号:2094723 上传时间:2023-01-09 格式:DOCX 页数:43 大小:106.43KB
返回 下载 相关 举报
通过wtc、jolt进行tuxedo与weblogic通信开发.docx_第1页
第1页 / 共43页
通过wtc、jolt进行tuxedo与weblogic通信开发.docx_第2页
第2页 / 共43页
通过wtc、jolt进行tuxedo与weblogic通信开发.docx_第3页
第3页 / 共43页
通过wtc、jolt进行tuxedo与weblogic通信开发.docx_第4页
第4页 / 共43页
通过wtc、jolt进行tuxedo与weblogic通信开发.docx_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《通过wtc、jolt进行tuxedo与weblogic通信开发.docx》由会员分享,可在线阅读,更多相关《通过wtc、jolt进行tuxedo与weblogic通信开发.docx(43页珍藏版)》请在三一办公上搜索。

1、标题:通过wtc、jolt进行tuxedo与weblogic通信开发 评论作者:李振嘉(dev2dev ID:lizhenjia)(一)摘要bea tuxedo与weblogic作为业界优秀的交易与应用服务器中间件产品,在电信,银行,金融等领域广泛应用,通常由tuxedo处理系统的核心业务,weblogic将业务应用扩展到internet平台,实现电子商务,由weblogic调用tuxedo的服务或者由tuxedo的服务调用通过weblogic部署的ejb,所以tuxedo与weblogic之间的互连通信会经常遇到,本文通过2个例子介绍tuxedo与weblogic通信的配置与开发,两个例子分

2、别通过wtc(weblogic tuxedo connector)、jolt实现weblogic与tuxedo通信的配置与开发.本文所有例子程序与配置均在Sun Solaris,weblogic8.1,tuxedo8.0平台上进行,如在windows等其他平台开发配置方法大同小异;另外为了减少篇幅文中涉及的例子代码没有全部罗列,只选择粘贴了关键部分的代码.(二)通过wtc进行tuxedo与weblogic通信的配置与开发1)域间通信以及wtc介绍 Tuxedo的域间通信进程介绍 Wtc是tuxedo通过域间通信实现的,所以需要tuxedo启动用于域间通信的进程,介绍wtc之前先介绍以下几个域间

3、通信的进程. *DMADM(DOMAIN ADMINISTRATOR SERVER)管理域的server,在运行时管理BDMCONFIG,对已登记的gateway group提供支持,在tuxedo系统中,只能有一个DMADM进程,且不能对它采用MSSQ,不能有REPLYQ. *GWADM(GATEWAY ADMINISTRATOR SERVER)管理域的域网关进程,在运行时可以对某一组域网关进行管理,主要从DMADM那里取得域的配置信息,并对域网管进程及跨越域的全局事务的LOG文件进行管理.*GWTDOMIN(GATEWAY PROCESS)处理域之前的互操作,使本地域和调用远程域可以互相调

4、用彼此的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

5、,在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=NONEWSGroup LMID=simple GRPNO=4 OPENINFO=NONE2)在ubb文件*SERVERS节点中增加如下3个tuxedo server:DMADMSRVGRP=DMGroup SRVID=22230GWADM

6、SRVGRP=GWGroup SRVID=22340GWTDOMAINSRVGRP=GWGroup SRVID=22350其中GWADM和GWTDOMAIN应该在同一个组中,保存ubb文件并按如下完成编译: tmloadcf ubb_filename 之后tmboot-y启动tuxedo server,如果启动以上3个server时报类似Application initialization failure的启动失败的提示信息,那么注意查看tuxedo的ULOG日志文件,通过日志的提示排除错误,这里常见的一个错误是没有在系统环境变量中定义BDMCONFIG或者指定该文件路径错误.(关于环境变量的

7、修改见下文).增加并编译dm文件dm文件是tuxedo进行域间通信时的配置文件,tuxedo与weblogic通过wtc通信是通过域间通信实现的,所以dm文件需要创建,dm文件通常可以存放在ubb文件所在的路径下.Dm需要做的配置如下:*DM_LOCAL_DOMAINS tuxedo_domain GWGRP=GWGroup TYPE=TDOMAIN DOMAINID=billing DMTLOGDEV=/././log/DLOG*DM_REMOTE_DOMAINSweblogic_domain TYPE=TDOMAIN DOMAINID=weblogic *DM_TDOMAIN tuxedo

8、_domain NWADDR=/tuxedoserver_domain_ip:port NWDEVICE=././binweblogic_domain NWADDR=/weblogicserver_domain_ip:port*DM_REMOTE_SERVICES*DM_LOCAL_SERVICESfml32_test RNAME=fml32_test*DM_LOCAL_DOMAINS定义本地tuxedo域的信息,分别定义该域所在的组,域类型,域的唯一标识,域间通信时日志的全路径,其中GWGRP, DOMAINID的值要与ubb文件中的定义匹配.*DM_REMOTE_DOMAINS定义远程we

9、blogic域的信息,分别定义域类型,域的唯一性标识,该id标识需要与在weblogic server中的配置名称吻合,否则通信将会失败,关于在weblogic中的相应配置下文将作详细描述.*DM_TDOMAIN定义在DM_LOCAL_DOMAIN中已经说明的本地域和在DM_REMOTE_DOMAINS中已经说明的远程域的具体的通信ip地址以及通信端口,其中NWDEVICE指定tuxedo发布的server通信进程文件所在的路径.*DM_REMOTE_SERVICES定义当前域需要调用远程域的服务名称,本例中的服务作为被调用服务,所以此处可以为空.*DM_LOCAL_SERVICES定义当前域

10、对外发布的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,vie

11、w,view32,fml,fml32等数据缓冲区,其中fml32类型相对复杂且比较常用,本例子采用fml32数据缓冲区开发,首先需要编写fml32数据缓冲区的定义文件,包括fml32数据缓冲区各个字段的名称已经长度等等,并将该文件生成相应的c语言.h头文件,在应用程序中需要包含该头文件,这样应用程序中即可以使用fml32数据缓冲区, fml32类型通常在开发数据库应用程序的时候比较常用,以下的例子完成的功能是:根据输入的学生学号从数据库中查询得到该学生的姓名和年龄,其实输入和输出参数采用fml32类型.编写并编译fml32数据缓冲区定义文件定义fml32数据缓冲区文件student_fld文件

12、如下:*base 10000 # name number type flags commentsstudent_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表,其

13、中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 student_fld.hEXEC ORACLE OPTION (RELEASE_CURSOR = YES);#if defined(_STDC_) | defined(_cpl

14、usplus) 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; i

15、f (sqlca.sqlcode) userlog(连接数据库失败,错误号码:%d,详细原因:%s , sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); return -1; #ifdef _cplusplus extern C#endifvoid#if defined(_STDC_) | defined(_cplusplus) fml32_test(TPSVCINFO *rqst)#else fml32_test(rqst) TPSVCINFO *rqst;#endif FBFR32 *recebuf = NULL; FBFR32 *sendbuf = NULL

16、; FLDLEN32 recebuflen = 0; EXEC SQL BEGIN DECLARE SECTION; long lStudentId = 0; char sName15 = ; long lAge = 0; EXEC SQL END DECLARE SECTION; recebuf = (FBFR32 *)rqst-data; if (sendbuf = (FBFR32 *)tpalloc(FML32, NULL, 1024) = NULL) tpterm(); exit(-1); recebuflen=0; Fget32(recebuf, student_id, 0, (ch

17、ar *)&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 , sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); exit(-2); Fchg32(sendbuf, student_age, 0, (char *)&lAge, 0); Fchg32(sendbuf, student

18、_name, 0, sName, 0); tpreturn(TPSUCCESS , 0, (char *)sendbuf, 0, 0);编写makefile文件.SUFFIXES:.pc .cCC=ccTUXINCLUDE=$(TUXDIR)/includeORAINCLUDE=$(ORACLE_HOME)/precomp/publicWORKPATH=$(HOME)/././.APPPATH=$(HOME)/binTARGET=wtc_joltall: $(TARGET) -echo build successfully! wtc_jolt:wtc_jolt.c buildserver -f

19、 wtc_jolt.o -o wtc_jolt -s fml32_test -r Oracle_XA -v.pc.c: proc iname=$services-wtc-Configure a new WTC serviceName属性键入: WTC_Service,create保存设置,此时WTC_Service将生成local tuxedo access等若干子项,在下面将一步一步配置这些项目.配置local tuxedo access mydomain-services-wtc- WTC_Service- Configure a new local tuxedo access point

20、 依次填写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_S

21、ervice- 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的名字.以

22、上信息填写完成后点击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

23、 access point的名字.2) Remote Access Point List是上面配置的remote tuxedo access point的名字.3) Remote Name是可供weblogic调用的远程tuxedo发布的service名字,即在Tuxedo dm文件的*DM_LOCAL_SERVICES节点中发布的service名字.配置wtc resourcemydomain-services-wtc- WTC_Service-resources- Configure a new Resource.FldTbl32 classes: student_fld注意:1)reso

24、urce定义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的程序为了减少篇幅例子代码没有全部罗列,只选

25、择粘贴了代码中的关键部分.编写访问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, RemoteExcepti

26、on; 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

27、 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;privat

28、e 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 ne

29、w TPException(TPException.TPENOENT, Could not get TuxedoConnectionFactory : + ne); try tuxConn = tcf.getTuxedoConnection(); catch (TPException e) throw new TPException(TPException.TPENOENT, getTuxedoConnection threw exception: + e); return tuxConn; 函数Tpcallpublic TypedFML32 Tpcall(String service_nam

30、e, 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(setUpConnection throw exception: + e); throw e; try tuxReply = tuxConn.tpcall(service_name

31、, in_params, 0); catch (TPReplyException tre) System.out.println(tpcall threw TPReplyExcption + tre); throw tre; catch (TPException te) System.out.println(tpcall threw TPException + te); throw te; catch (Exception ee) System.out.println(tpcall threw exception: + ee); throw new TPException(TPExceptio

32、n.TPESYSTEM, Exception: + ee); tuxRtn = (TypedFML32)tuxReply.getReplyBuffer(); return tuxRtn; 函数Tpacallpublic CallDescriptor Tpacall(String service_name, TypedFML32 in_params) throws TPException, TPReplyException CallDescriptor tuxRtn = null; try tuxConn = this.setUpConnection(); catch (TPException

33、e) System.out.println(setUpConnection throw exception: + e); throw e; try tuxRtn=tuxConn.tpacall(service_name,in_params, ApplicationToMonitorInterface.TPNOTIME); catch (TPReplyException tre) System.out.println(tpacall threw TPReplyExcption + tre); throw tre; catch (TPException te) System.out.println

34、(tpacall threw TPException + te); throw te; catch (Exception ee) System.out.println(tpacall threw exception: + ee); throw new TPException(TPException.TPESYSTEM, Exception: + ee); return tuxRtn; 函数Tpgetrplypublic TypedFML32 Tpgetrply(CallDescriptor cd) throws TPException, TPReplyException Reply tuxRtn = null; TypedFML32 result = null; try if (tuxConn = null) tuxConn

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号