BEA Tuxedo 的七种通信方式⑵
■北京 经乾
5.广播和通告
系统提供了一种基于事件的通信机制,通过这种机制,系统进程之间可以相
互转递通知消息。 支持两种类型的事件通信:通告和代理。通告(也称为广播)
是指消息发送方直接将消息发送给接收方,而
代理是指通信双方通过一个匿名的事件代理中
介来完成消息的接收和发送。通告消息可以使
用 或 调用来发送,
前者只将事件通知给单个通信实体,后者可以
将事件广播给一个或多个通信实体。
图 展示了一个消息通告的例子。 服务
使用 调用给客户机发送通知消息,
客户机使用 调用来设置一个消
息处理器 。 服务给客户机发送通知
消息时,并不会影响客户机和服务器正在进行
的“请求/应答”或会话通信。在一个非信号系统
中,客户机必须使用 调用来检
查 意 外 事 件 , 而 在 信 号 系 统 中 ,
什么也不做,立即返回。
下面的代码段演示了事件通告的处理过程。上面的部分是客户程序,它定义了一个事
件处理器 。 的声明必须遵循如下格式:
func
第一个参数定义了事件的消息体,它是一个
类型缓冲区;第二个参数定义了消息体的长度,
第三个参数是标志位。
void定义了一个指向函数指针的指
针 ,它指向事件处理器 。tpalloc调用
申请了一块 ! 类型的缓冲区
, 中填入了用户名、客户机名和
信号标记 "#$ %。tpsetunsol调用将
指向的函数 设置为客户机的事件处理器。
下面的部分是服务程序,它通过 tpnotify
调用向 & 客户发送通知消息,当然也
可以使用 tpbroadcast调用来给 '& 客户机发
送消息。若需要给 $ () 上所有的客户机发送通
知消息,可以用通过如下语句来完成*
tpbroadcast+$ ()+!",,!",,---
客户程序对通知消息的获取模式可以通过配
置文件中.($/".0( 段的 !/ 12 参数来设
置,!/ 12 可取
$ %!3,、4 !、 %!/.( 三个值,分别对
… …
void func(char *, long, long);
int main(int argc, char *argv[]){
TPINIT * tpinfop;
void (**p)();
long len;
p=&func;
tpinfop = tpalloc("TPINIT", NULL,
TPINITNEED(0));
strcpy(tpinfopusrname, "jq");
strcpy(tpinfopcltname, "jq");
tpinfopflags = TPU_SIG;
tpinit(tpinfop);
tpsetunsol(p);
tpcall("X",NULL, 0, &line, &len, 0);
tpterm();
}
void func(char * string, long len, long flag){
printf("%s",string);
return;
}
X(TPSVCINFO *rqst)
{
char * line;
line = tpalloc("STRING", NULL, 80+1);
strcpy(line,"notification from X service");
tpnotify((CLIENTID *)&rqstcltid,
line, 0L, TPNOBLOCK);
//tpbroadcast(NULL,"jq","jq",
line , 0, TPSIGRSTRT);
tpreturn(TPSUCCESS, 0,
rqstdata, 0L, 0);
}