分类:
2009-08-22 13:28:40
在嵌套服务中,最里层嵌套服务可以直接给客户程序一个响应,没有必要按照调用栈逐级返回,这就使其它嵌套服务可以处理其它请求,当第一个服务是一个分发代理时,这种模式是非常有用的。在嵌套调用中,被客户调用的服务X使用tpforward(
会话通信适合于有多个缓冲区需要以有状态的方式在BEA Tuxedo客户程序和服务之间传递的场合。恰当地使用BEA Tuxedo的会话,因为参与会话的服务器在会话结束之前是不可用的。要完成会话通信,你的代码需要遵循如下步骤:
⑴.客户程序使用tpconnect()启动会话;
⑵.客户程序和服务使用tpsend()和tprecv()函数进行数据交换,一个特殊的标记指示着当前由哪一方来控制着会话;
⑶.当服务程序调用tpreturn()或tpdiscon()函数时,会话正常终止。
要处理服务器的消息通知,客户程序必须使用tpsetunsol()函数来创建一个消息处理器,要发送主动消息,BEA Tuxedo客户程序或服务程序可以调用tpnotify()来把消息传递给单个客户程序,也可以通过tpbroadcast()函数来把消息同时广播给多个客户程序。当客户程序收到主动消息后,BEA Tuxedo系统调用客户程序的主动消息处理器来处理。
在一个基于信号系统中,客户程序没有必要处理所有的主动消息,然而,在一个非信号系统中,客户程序必须使用tpchkunsol()函数来检查主动消息。当客户程序调用一个服务请求时,tpchkunsol()被隐含地调用。在调用tpnotify()时,如果你设置了tpack标记位,你将会收到一个请求通知。
在基于事件的通信中,事件可以被发送到应用程序队列、LOG文件和系统命令。当BEA Tuxedo服务或客户程序调用tppost()函数时,任何一个BEA Tuxedo客户程序都可以使用tpsubscribe()函数订阅用户自定义事件;当BEA Tuxedo系统检测事件时,客户程序也可以订阅系统定义事件。当一个服务器死了,.SysServerDied事件就会被发布,它由BEA Tuxedo系统自动完成,不需要应用服务器干预。
为了实现了和/Q系统的接口,BEA Tuxedo客户程序使用两个ATMI函数,使用tpenqueue()把消息放入队列空间,使用tpdequeue()来把消息从队列空间中取走。
下面演示了点对点异步消息机制。一个客户程序使用tpenqueue()函数将消息传给服务,响应队列和失败队列的名字可以作为参数包含在tpenqueue()调用中,由于在队列中的数据是持续的,因此,所有和排队消息相关的响应消息和失败消息都可以从相应的响应队列和失败队列中取得。客户程序可以使用缺省的排队顺利,即按放放顺利排队,先进先出;也可以改变排队规则,如把一个消息放在队列开始,或放到另一个队列前面。Tpenqueue()调用把消息送到TMQUEUE服务器,并被放入固定存储体中进行排队,然后给客户程序发送一个通知消息。队列管理器给消息分配一个标识符,使用它可以随时将消息踢出队列,也可以用于tpenqueue()中,指示将新消息紧挨着标识符标识的消息。在消息出队时,要出队消息的事务必须成功地提交。客户程序使用tpdequeue()来使消息出队。
下面演示了消息被转发到另一个服务器。客户程序发出一个消息,要调用服务器上的X服务,X服务接收消息后,处理消息中的指令,然后把响应放入队列空间,客户程序再从队列空间中取出。排队系统对于服务来说是透明的,也就是说,不论服务请求是从队列发出的,还是通过tp(a)call发出的,服务都能接受。
要使用事务,应用程序开发者需要使用如下ATMI函数:
⑴.tpbegin(),用于开始一个事务;
⑵.tpcommit(),开始一个二阶段提交处理;
⑶.tpabort(),产即终止事务。
任何放在begin,commit/abord之外的代码不包含事务中。在下面的例子中,客户程序打开了一个事务,请求了两个服务,并且提交了事务。因为服务请求是在事务开始和提交之间完成的,所以两个服务的行为都被了事务记录。