
中間層服務器TMTS
火星牛
码农,兼爱诗词绘画,delphi,nodejs,重庆大学
展开
-
(7)序列化与压缩(2)
为每种需要传递的参数去定义一个TSerialableComponent,也是比较麻烦,用Key/Value的字典更简洁。TStringList就是一个可以作为Key/Value来使用的字典,通过Values(Key)函数来读写值,通过Text属性来序列化和反序列化。但是对复杂原创 2011-08-17 18:51:23 · 834 阅读 · 0 评论 -
(7)序列化与压缩
因为ServiceObject的函数签名格式是统一的,可以传递的参数只有一个AParams:OLEVariant,客户端的多个参数需要使用数组传递。如:var vParams:OLEVariant; vResult:integer;begin ... vParams:=VarArrayCreate([0,1],varVariant); vParams[0]:=原创 2009-09-13 11:07:00 · 1332 阅读 · 0 评论 -
(6)有状态与无状态
ServiceObject通常都应该是无状态的,即它使用完放入Pool中,另一个调用再激活它时,每次的执行行为都是一样的,不会用到上次调用所保留在内存中的某些资料,因为元件被激活调用的顺序是随机的,可能这次被A客户端激活,再次被B客户端激活,下次又被A客户端激活。如果保留状态,需要非常注意状态是如何被利用的。但并不是说元件一定不能有状态,根据一些特殊的需要,你可以自己保留元件的状态。如,我们考原创 2009-09-13 10:18:00 · 991 阅读 · 0 评论 -
(5)Transaction控制
ServiceObject的TransactionMode有三个取值:不需要交易,需要交易,需要新的交易。ServiceObject的方法被调用时会建立一个TTransactionContext,并随着子元件,子子元件的调用传递,子元件,子子元件只是对这个Transaction投票,是需要Commit还是Rollback,根元件根据最后结果来决定最后该Commit还是Rollback。 TC原创 2009-09-11 22:31:00 · 682 阅读 · 0 评论 -
(4)异步调用
有这几种情况我们需要异步调用。1、如果一个任务需要很长的时间才能运行完,而客户端不想一直等待。当然,纯粹的只想避免客户端UI等待,客户端可以创建另一个线程来发起调用。但是这个调用的线程和服务器还是一直连接的,如果调用使用的TCP就是TCP一直在连接,但是对于远距离的网络,如internet,或不稳定的网络,在调用期间很难说不会断开连接,而这种RPC调用一旦断开,调用就失败。所以我们需要避免长时原创 2009-09-11 21:56:00 · 804 阅读 · 0 评论 -
(3)超时服务的终止
客户端的不当使用或ServerObject的设计不良,一次服务会常时间执行或长生不死,这常时间占据服务器的CPU和资源,影响服务器对别的客户的服务,因此,需要设定一个服务超时时间,如1分钟、10分钟,超过这个时间的调用就会被强制终止。如何终止?当然是终止服务的线程,但千万不要使用TerminateThread这个API,它太暴力,使线程没有机会执行清理工作,外面也不知道这个线程已经被终止,典型原创 2006-11-10 22:27:00 · 2077 阅读 · 0 评论 -
(2)物件池
物件池比较简单 ,概念上就是重复使用闲置的无状态元件,避免反复释放/创建,实现也比较简单,就用一个TList就可以了,需要注意的有两个问题: 1、线程同步,Service肯定是多线程的(也有用进程来代替线程的),在存取TList是要用TCriticalSection或别的保护;2、物件池大小,应该设定一个池大小限制,即池中不需要放太多闲置元件(毕竟是占内存的);物件总的数量(闲置的加忙碌原创 2006-11-10 21:48:00 · 1008 阅读 · 0 评论 -
(1)TMTS基本架構
1、TMTS是一個服務器,类似COM+服务器,在接口裏只有一個函數: IBizService=interface(IConnectionService) [{11C672E9-6082-4ACD-93AB-3F3A18E44E6F}] //clone a interface for multi-thread function Clone:IBizSer原创 2006-06-06 15:08:00 · 1932 阅读 · 0 评论