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

配置解释
在A,B主机的dmconfig配置中,
B主机上,TDOM01在DM_LOCAL_DOMAINS中
在A主机上TDOM01在DM_REMOTE_DOMAINS中,两个相联的端点名字要相同,
在*DM_TDOMAIN域中:
B主机是TDOM01 NWADDR="//192.168.1.100:3070"
A主机也是TDOM01 NWADDR="//192.168.1.100:3070"
表明以TDOM01命名的一个连接通道,相互间通过3070端口通信

有了两台主机间相互通信的通道,就可以通过这个通道进行通信,传输数据信息.
在A主机的*DM_LOCAL_SERVICES节点定义中,是A主机导出给别的server调用的本地服务,在这儿有一个DOMAIN_TEST服务被导出,根据上面的定义,这个服务将被导出给主机192.168.1.100使用
在B主机的*DM_REMOTE_SERVICES节点定义中,是B主机通过domain导入的,可以供本地调用的服务,该服务名可以通过在psc命令中可以看到.

其实通过client4的测试代码可以看到,我们提供给客户调用的服务和主机可能是固定的,但是根据不同的参数,将请求不同主机上的服务.

举例
比如商业银行ATM取款机作为一个client只能请求所在银行的service,比如卡验证都请求userValidate这个服务,但是有可能这张卡是其他银行的,需要调用其他银行的服务,比如JuserValidate代表建设银行,GuserValidate代表工商银行,可以采用domain和这些银行的server建立连接,导入JuserValidate,GuserValidate服务,当商业银行的userValidate判断银行卡号,如果是建设银行的,就tpcall服务JuserValidate,如果是工商银行,就tpcall服务GuserValidate.

重命名服务
上面例子中,如果所有银行的卡验证服务名都是userValidate,或者即使不重名,但是我们想得到一个符合本系统规范的服务名,我们不可能去要求建设银行,工商银行都修改服务名吧,即使可以修改,在对方系统上运行的依赖域原来服务名的程序都需要修改,这样就会造成很大的工作量,很麻烦的协调工作.

由于从远程server通过domain导入的服务名有可能和本地的服务名重名,所有有必要对远程导出的服务名重新命名,这样避免在本地server中造成服务重名,避免一些不可预测的错误.
所有的配置都和上面一样,只是修改了A和B的dmconfig配置文件
A的dmconfig配置文件:

*DM_LOCAL_DOMAINS
TDOM02 GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID="TDOM02"
DMTLOGDEV="/home/dev/app/src/bin/logs/DLOG"
*DM_REMOTE_DOMAINS
TDOM01 TYPE=TDOMAIN
DOMAINID="TDOM01"
*DM_TDOMAIN
TDOM02 NWADDR="//192.168.1.113:3071"
TDOM01 NWADDR="//192.168.1.100:3070"
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
DOMAIN_TEST LDOM=TDOM02 RNAME="NET113_DTEST"
#DOMAIN_TEST LDOM=TDOM02 RNAME="DOMAIN_TEST"
#DOMAIN_TEST


B的dmconfig配置文件:

*DM_LOCAL_DOMAINS
TDOM01 GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID="TDOM01"
DMTLOGDEV="D:\bea\tuxedo8.1\apps\simpapp\dlog.txt"
*DM_REMOTE_DOMAINS
TDOM02 TYPE=TDOMAIN
DOMAINID="TDOM02"
*DM_TDOMAIN
TDOM02 NWADDR="//192.168.1.113:3071"
TDOM01 NWADDR="//192.168.1.100:3070"
*DM_REMOTE_SERVICES
NET113_DTEST RDOM=TDOM02
RNAME="NET113_DTEST"
#*DM_LOCAL_SERVICES
#DOMAIN_TEST


从上面可以看到在A的dmconfig中,对DOMAIN_TEST服务导出服务名为NET113_DTEST,在B的dmconfig中,定义了NET113_DTEST服务从远程节点TDOM02导入的.

方法二:
A主机dmconfig配置:

*DM_LOCAL_DOMAINS
TDOM02 GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID="TDOM02"
DMTLOGDEV="/home/dev/app/src/bin/logs/DLOG"
*DM_REMOTE_DOMAINS
TDOM01 TYPE=TDOMAIN
DOMAINID="TDOM01"
*DM_TDOMAIN
TDOM02 NWADDR="//192.168.1.113:3071"
TDOM01 NWADDR="//192.168.1.100:3070"
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
DOMAIN_TEST LDOM=TDOM02 RNAME="DOMAIN_TEST"
#DOMAIN_TEST LDOM=TDOM02 RNAME="NET113_DTEST"
#DOMAIN_TEST


B主机dmconfig配置:

*DM_LOCAL_DOMAINS
TDOM01 GWGRP=LGWGRP
TYPE=TDOMAIN
DOMAINID="TDOM01"
DMTLOGDEV="D:\bea\tuxedo8.1\apps\simpapp\dlog.txt"
*DM_REMOTE_DOMAINS
TDOM02 TYPE=TDOMAIN
DOMAINID="TDOM02"
*DM_TDOMAIN
TDOM02 NWADDR="//192.168.1.113:3071"
TDOM01 NWADDR="//192.168.1.100:3070"
*DM_REMOTE_SERVICES
NET113_DTEST RDOM=TDOM02 RNAME="DOMAIN_TEST"
#NET113_DTEST RDOM=TDOM02 RNAME="NET113_DTEST"
#*DM_LOCAL_SERVICES
#DOMAIN_TEST


从上面可以看到在B主机的dmconfig中,通过RNAME属性把原A主机中定义导出的原服务名DOMAIN_TEST导入重命名为NET113_DTEST.

重新编译A,B主机的dmconfig配置文件,重启服务.

在B主机的环境中编写一个测试程序client5.c,如下:

#include <stdio.h>
#include "atmi.h"
#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
char *argv[];
#endif
{
      char *sendbuf, *rcvbuf;
      long sendlen, rcvlen;
      int ret;
      if(argc != 2) {
            (void) fprintf(stderr, "Usage: client2 string\n");
            exit(1);
      }
      if (tpinit((TPINIT *) NULL) == -1) {
            (void) fprintf(stderr, "Tpinit failed\n");
            (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
            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(1);
      }
      if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
            (void) fprintf(stderr,"Error allocating receive buffer\n");
            tpfree(sendbuf);
            tpterm();
            exit(1);
      }
      (void) strcpy(sendbuf, argv[1]);
      ret = tpcall("NET113_DTEST", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
      if(ret == -1) {
            (void) fprintf(stderr, "Can't send request to service NET113_DTEST\n");
            (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
            printf("error message is %s\n",tpstrerror(tperrno));
            tpfree(sendbuf);
            tpfree(rcvbuf);
            tpterm();
            exit(1);
      }
      (void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);
      tpfree(sendbuf);
      tpfree(rcvbuf);
      tpterm();
      return(0);
}


在B主机上编译生成客户端程序client5,执行如下命令:

buildclient -v -o client5 -f client5.c


运行测试程序client5,命令如下:

client5 wwwddddddsds


返回:Returned string is: WWWDDDDDDSDS

这样通过上面的方法在远程server上面通过dmconfig重命名服务名,我们就可以定义符合我们习惯的服务名JuserValidate和GuserValidate服务名.




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