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

在server端 tuxedo本身提供了一个标准的main()函数,它负责完成一些必要的工作。server端编程只需要编写service处理函数,进行service的请求处理和回应处理。所以,在server端不需要调用tpinit()和tpterm()。

1.TPSVCINFO
每个service函数都有统一的形式:

void tpservice(TPSVCINFO *svcinfo);


只有一个参数,该参数是指向TPSVCINFO结构的指针(atmi.h)。该结构定义如下:

struct tpsvcinfo {
      char name[32]; /*service名(最大15个字符)*/
      long flags; /* client调用时指定的flags */
      char *data; /* 接收的数据地址 */
      long len; /* 数据长度 */
      int cd; /* 会话方式下的连接描述符 */
      long appkey; /* 应用认证的key */
      CLIENTID cltid; /* client ID */
};


2.buffer管理
在service函数里,一样可以调用tpalloc()、tpfree()、tprealloc()处理自定义的buffer。
通过TPSVCINFO参数传递的buffer是使用tpalloc()分配的,所以可以对它使用tprealloc()。
要注意的是在service函数里自己调用tpalloc()分配的空间在退出要释放,除非该空间作为tpreturn()或tpforward()的参数。如果分配的空间不释放,最终会耗尽该server的内存资源。
对于TPSVCINFO传递的buffer不用手动释放。
使用举例:

void
BAL(TPSVCINFO* input)
{
      char *f, *f1, *f2;
      f=input->data;
      f1=tpalloc(“STRING”, NULL, 80);
      f2=tpalloc(“STRING”, NULL, 120);
      . . .
      tpfree((char *) f2);
      tpreturn (TPSUCCESS, 0, f1, 0, 0);
}


可以使用tptypes()查看buffer的类型。如:

void ABAL(TPSVCINFO *transb)
{
      char type[20], subtype[20];
      long len;
      len = tptypes(transb->data, type, subtype);
      if (len == 0) {
            /*error*/
            userlog(“NULL message sent...\n”);
            ...
      }
      if (strcmp(type, “FML”) == 0) {
            /* convert FML to aud VIEW; */
      } else if (strcmp(type, “VIEW”) == 0) {
            if (strcmp(subtype, “aud”) != 0) {
                  /*error*/
                  userlog(“Wrong VIEW subtype...”);
                  ...
            }
      } else {
      /*error*/
      userlog(“Invalid buffer type ...”);
      ...
}
}


3.server的client角色
tuxedo的机制允许一个server程序作为client,调用tpcall()去请求别的service服务。这样做可以避免代码的冗余,但效率上会有牺牲。
这样做时有一些情况要注意:
如果一个server要把负责返回接收到的buffer,则不要使用这个buffer作为参数来请求别的service服务。可以分配辅助性的buffer来处理,这样做可以避免在tpcall()过程中改变了输入buffer的内容和类型。
一个server不能请求一个只被它本身发布的service。这样做会导致死锁。例外是请求时指定TPNOREPLY标志。




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