[转帖]TUXEDO会话通信的编程方法_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4066 | 回复: 0   主题: [转帖]TUXEDO会话通信的编程方法        下一篇 
ying
注册用户
等级:上尉
经验:694
发帖:59
精华:0
注册:2012-10-12
状态:离线
发送短消息息给ying 加好友    发送短消息息给ying 发消息
发表于: IP:您无权察看 2012-11-7 15:26:04 | [全部帖] [楼主帖] 楼主

TUXEDO有会话通信方式,这种方式比较适合大批量数据的传输

1)Server端
        1. 对于大批量数据的传输,建议使用一个变量来记录当前的数据条数,达到一定的条数后,即可把数据返回给客户端程序。
        2. 使用循环来发送数据,在发送给客户端数据时,使用tpsend这个函数,如:

 ret = tpsend(rqst->cd, (char *)oBuf, 0, TPRECVONLY, &revent);


           TPRECVONLY这个常量,表示server在发送完oBuf中的数据后,变成只能接收数据。同时Client端会产生TPEV_SENDONLY事件。
        3. 在发送完数据后,由于被阻塞,要是用tprecv来进行监听,收到客户端的消息后,立即开始下一批数据的传送。调用tcprecv之后,server端在收到cilent发来的消息之前,一直处于阻塞状态。          

 ret = tprecv(rqst->cd, (char **)&oBuf, &oBufLen, TPNOCHANGE, &revent);


        4. 反复上述2、3过程,即可完成数据的会话式传送。
        5. 在最后,返回一个TPSUCCESS状态给Client端。

 tpreturn(TPSUCCESS, 0, NULL, 0L, 0);


           这样的话,客户端可以根据tprecv的返回值来判断Server端是否把数据全部发送完毕,判断的条件为:

 ret == -1 && tperrno==TPEEVENT && revent==TPEV_SVCSUCC


   (2)Client端
       Client端和Server基本上一样,在流程上是相反的。
       1. 由于采用会话方式调用TUXEDO服务,那么在客户端连接服务时不能使用tpcall,而是使用tpconnect来进行。

 connectId = tpconnect("XXXX", (char *)oBuf, len, PRECVONLY|TPSIGRSTRT);


          表示连接XXXX服务,如果成功,返回值connectId是该连接的标识符,否则为-1。
       2. 客户端使用循环的方式调用tcprecv,是客户端进入阻塞状态,等待数据的传输。

 ret = tprecv(connectId, (char**)&iBuf, &iBufLen, TPNOCHANGE, &revent);


          在收到数据后,要对tcprecv的返回值进行检查。

 ret == -1 && tperrno==TPEEVENT && revent==TPEV_SVCSUCC


          如果以上条件被满足,则表示数据已经传输完毕,即可退出循环。

 ret == -1 && revent == TPEV_SENDONLY


          如果该条件被满足,则表示有数据传输进来,可以对数据进行分析处理。
          ret == -1 && tperrno!=TPEEVENT 这个条件可以用来判断tprecv调用是否出现问题。
       3. 在对数据处理完毕后,Client端要向Server端发送索要下一批数据的消息。如果和Server端无数据交互的话,可以使用一下的方法:

 tpsend(connectId, NULL, 0, TPRECVONLY, &revent);


          该函数调用后,会在Server端会产生一个TPEV_SENDONLY的事件,那Server端就��以根据收到该事件继续发送下一批数据。
       4. 通过以上的反复过程,即可完成Client端对Server端的数据的接收。

   经过实际编程实现,积累了对TUXEDO会话通信方式的认识。个人对编程模式简单总结为:

 Server: Fget(); /* 获取Client端初始送来的数据,常用于数据查询条件等 */
while(1) {
      ......
      Fadd(); /* 将数据压入缓冲区 */
      tpsend(); /* 发送缓冲区的数据给Client,会在Client端产生TPEV_SENDONLY事件 */
      ......;
      tprecv(); /* 阻塞,监听是否有来自Client端的数据 */
}
tpreturn(TPSUCCESS, 0 ,NULL, 0, 0); /* 使得Client断能够产生TPEV_SVCSUCC事件,以便Client能够退出循环,程序结束退出 */
Client: tpconnect(); /* 连接服务 */
tpsend(); /* 初始发送给服务的数据 */
while(1) {
      tprecv(); /* 阻塞,监听���否有来自Server端的数据 */
      ......
      tpsend(); /* 发送空数据给Server,在Server端产生TPEV_SENDONLY事件 */
}




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