TUXEDO订阅事件

24 篇文章 0 订阅
14 篇文章 0 订阅

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值