回答《关于Remoting的几个问题》

非常高兴拙文能对阁下的工作起了一点作用。我也是Remoting技术的初学者,希望我们能共同探讨。

你的问题:
1.服务器端程序开始时在8080端口发布了远程对象rObject,但之后用RemotingServices.Disconnect(rObject)注销了该对象,但之后如果我想在8081端口再发布rObject应该如何处理呢?
2.服务器端程序开始时用TCP信道发布远程对象rObject,但之后改为用Http信道发布rObject应如何处理?
3.在服务器端如果要用RemotingServices.Disconnect(rObject)注销了对象,如果想该对象被回收,是否要用GC.Collect()方法?
4.服务器端开始时在8080端口发布了rObject,而且客户端程序中
可正常访问该对象,但如果服务器端改为在8082端口发布rObject,客户端程序应该如何做才能访问到rObject?
5.服务器端开始用Tcp信道发布rObject,但之后改用Http信道发布对象,那么客户端程序应该如何做才能访问到rObject?

看了你的问题,我想综合起来,主要是两方面的内容。一是服务器端配置的改变,以及发生改变时,客户端的调用应如何应对(1、2、4、5)?二是对象生命周期的管理(3)。

先从整体上说。如果你的应用程序会经常改变服务的配置,那么我建议你使用配置文件来设置你的Remoting,而非使用代码的方式。你可以使用Remoting推荐的配置文件,在我的文章里有简单介绍;也可以自己写一个xml配置文件。同时提供修改给配置文件的方法。我目前的项目用的就是后者。当然这里指的配置文件,应该包括服务器端和客户端。显然地,当服务器端的配置发生改变时,例如端口号发生改变,那么客户端必然应作相应的改变。

不过你的每个问题又有不同的环境,所以我再想对每个问题啰嗦几句。
1:要想在8081端口重新注册原来的对象,必须是再注册新通道,将其端口号设置为8081,然后Marshal该对象。不过这里有个问题是,你的8080端口的通道是否还要保留?如果不保留,那好办,在重新注册新通道之前,先将8080端口的通道Unregister。如果还要保留,即为多通道服务了,此时首先要保证新注册的通道名与原通道名不相同。另外,还有一个问题。我们可以注意到在Marshal对象时,并没有指定是哪一个通道。事实上,如果是多通道的话,当我们Marshal对象时,实际上不仅8081新通道有了该对象,8080也有,除非你注销了该通道。此时,客户端既可以通过8081来访问,也可以通过8080来访问。那么,你在8080的Disconnect也就失去了意义。这也是我一直比较郁闷的。
2:此问题同前。如果是多通道,仍然存在这个问题,就是Marshal对象时,http和tcp通道会同时具备该对象。
3:这是生命周期的问题。我注意到你是用Disconnect来注销对象。那么该对象必然是采用在服务器端显示创建对象实例,然后再Marshal的。那么此时Disconnect的是你创建的该对象。不过,要明白的是Disconnect终止的是这个对象在Remoting通道的生命,此时客户端已无法访问该对象了。但在服务器端,由于你的Remoting服务主程序仍然存在,那么对象显然还未被销毁(因为没有调用主程序的析构函数)。而GC对它也是不予理会的,因为该对象实际上一直被服务器端的进程所占用。
4和5:前面已经解答了,答案就是使用配置文件。至少对于我来说,这是我目前所知道的解决方案。

不知道,这样是否能解决你的问题?对于Remoting,目前我也处于一知半解中,希望能和你探讨,并共勉。

谢谢。

wayfarer
posted @ 2004-09-19 11:30  张逸  阅读(640)  评论(10)    收藏  举报