TUXEDO订阅事件
TUXEDO订阅事件主要包括用户事件订阅,在网络上可以参考的资料很少。我们就用一个例子来剖析tuxedo订阅。
先需要来了解几个问题:
1.如何订阅事件
2.事件回调的方式
订阅事件我们采用tpsubscribe订阅事件.
Tpsubscribe(("\\..*", NULL, &ctl, TPSIGRSTRT));
第一个参数代表订阅事件类型,第二个参数表示筛选器,第三个参数表示一个结构体,结构体中主要包含回调服务名,第四个参数为一个flag值。返回值如果成功返回一个订阅句柄,否则返回-1.
取消订阅tpunsubscribe(sub_handle, TPSIGRSTRT),第一个参数为订阅句柄,第二个参数为flag值。
另一种方式我们可以使用tpsetunsol(funcname)的方式来设置回调函数。用回调函数的方式在订阅时,tpsubscribe第三个参数必须设置成NULL。
理解回调的基本规则以后,我们需要在ubb文件中配置事件代理服务器,实际上就是我们需要配置一个事件进程,收集发生的事件。对于系统事件来说,我们需要配置TMSYSEVT这个进程,对于用户自定义事件(tppost发布)来说需要配置TMUSEREVT.-p参数为扫描周期,单位是秒。
下面例子是订阅系统事件的例子。主要包含三个重要文件,tux.env,ubb,sub.c
Tux.env,环境变量
....
FIELDTBLS=tpadm
FLDTBLDIR=${TUXDIR}/udataobj
export FIELDTBLS FLDTBLDIR
这里主要是配置了系统的FML文件
Ubb
....
*SERVERS
sub SRVGRP=GROUP5 SRVID=3 RQPERM=0666
TMSYSEVT SRVGRP=GROUP1 SRVID=100 RESTART=Y GRACE=900 MAXGEN=5
CLOPT="-A --"
TMSYSEVT SRVGRP=GROUP2 SRVID=200 RESTART=Y GRACE=900 MAXGEN=5
CLOPT="-A -- -S -p 120"
#屏蔽了用户事件
#TMUSREVT SRVGRP=GROUP3 SRVID=300 RESTART=Y MAXGEN=5 GRACE=3600
#CLOPT="-A --"
#TMUSREVT SRVGRP=GROUP4 SRVID=400 RESTART=Y MAXGEN=5 GRACE=3600
#CLOPT="-A -- -S -p 120"
WSL SRVGRP=GROUP5 SRVID=1 CLOPT="-A -t -- -n //192.168.72.73:14325 -m 1 -M 5 -x 10 -I 1000 -N 60 -p 30000 -P 31000"
具体实现代码文件:sub.c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
#include <tpadm.h> /*系统FML文件*/
#include <fml32.h>/*FML操作*/
/*the handle of subscription*/
int sub_handle = -1;
int
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
/* Some compilers warn if argc and argv aren't used. */
argc = argc;
argv = argv;
/* userlog writes to the central TUXEDO message log */
userlog("Welcome to the sub server!");
/*test sub*/
TPEVCTL ctl;
ctl.flags = TPEVSERVICE;
//tpsetunsol(myfun); /*函数定义方式*/
//sub_handle = tpsubscribe("\\..*", NULL,NULL, TPSIGRSTRT)) ;
strcpy(ctl.name1, "SUB");
int sub_handle = -10;
if ((sub_handle = tpsubscribe("\\..*", NULL, &ctl, TPSIGRSTRT)) == -1)
{
(void)userlog("failed to subscribe to the broker -- %s\n",
tpstrerror(tperrno));
}
else
{
(void)userlog("successed to subscribe to the broker the handl is-- %d\n", sub_handle);
}
return(0);
}
void tpsvrdone()
{
if(sub_handle > 0)
{
if(tpunsubscribe(sub_handle, TPSIGRSTRT) == -1)
{
(void)userlog("failed to unsubscribe to the broker -- %s\n",
tpstrerror(tperrno));
}
else
{
(void)userlog("successed to unsubscribe to the broker -- %s\n",
tpstrerror(tperrno));
}
}
return;
}
/* This function performs the actual service requested by the client.
Its argument is a structure containing among other things a pointer
to the data buffer, and the length of the data buffer.
*/
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
SUB(TPSVCINFO *rqst)
#else
SUB(rqst)
TPSVCINFO *rqst;
#endif
{
char data[128];
FBFR32 *transf;
transf=(FBFR32 *)rqst->data;
FILE * fp=fopen("./log","a");
Ffprint32(transf,fp);
fclose(fp);
/*FBFR32 *transf;
transf=(FBFR32 *)rqst->data;
int eveCount=Foccur32(transf,TA_EVENT_NAME);
for(int i = 0; i < eveCount; i++)
{
Fgets32(transf,TA_EVENT_NAME,i,t_EventName);
Fgets32(transf,TA_EVENT_DESCRIPTION,i,t_EventDescript);
Fgets32(transf,TA_EVENT_SEVERITY,i,t_EventSeverity);
Fgets32(transf,TA_SERVERNAME,i,t_ServerName);
}*/
sprintf(data,"my info(data length): ->%d", rqst->len);
userlog(data);
tpreturn(TPSUCCESS, 0, NULL, 0L, 0);
}
这个例子订阅了系统函数,然后获取系统发布过来的数据,获取了事件名称,事件描述等,用到的知识点主要是tuxedo事件订阅与FML操作。
欢迎转载,请保留以下信息:
本文作者:bobui,欢迎tuxedo开发者交流,邮箱bobui@163.com,QQ:125941562