配置解释
在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服务名.