2021SC@SDUSC
目录
一、写在前面
在上一篇博客中我们了解了在ServerSocket监听到客户端socket连接后将socket句柄送至何处,即建立了一个作业,在这个作业中由Connection负责接收与解析报文,ConnectionServer负责执行过程调用.我们已经了解了Connection接收与解析报文的过程,接下来我们将对Connection的run方法与ConnectionServer进行学习.
二、设计模式-抽象工厂
工厂模式是为了应对要求一类产品中的多种产品而产生的,对产品对象的创建细节进行了隐藏,提高了扩展性,其大体业务流程为:获取创建工厂对象->配置工厂参数->调用工厂相关方法生产对象.而抽象工厂则是用于解决需要一个产品族中的多类产品问题,在抽象工厂模式中,存在一个创造工厂的超级工厂,用于生产具有不同配置的工厂.
在ConnectionServer中存在一个生产处理单元的WorkerFactory,这个对象的产生即遵循了抽象工厂模式,在认识了这一点后我们在看到这个工厂的多级继承层次与worker对象产生的复杂过程时就明白了其必要性:WorkerFactory并非只为RPC服务,因此要尽可能地进行解耦.
三、ConnectionServer继承层次
下面简要地对每一层级的功能进行介绍.XmlRpcController为抽象类,声明了获取工厂的方法与获取工厂配置的方法. XmlRpcServer实现了XmlRpcController,而且实现了获取注册方法调用句柄的方法、获取输出流的方法、调用句柄的方法、返回响应对象的方法.XmlHttpServer增加了设置响应头的方法,ConnectionServer重写了设置相应头与返回响应对象的方法.
四、ConnectionServer及其祖父类关键源码
在本次分析源码的过程中,要想明白其继承关系及系统运行中扮演的角色,不妨从上篇博客中Connection的run方法讲起,因为在run方法中所调用XmlRpcServer的execute方法是Connection与ConnectionServer产生交集的唯一桥梁.
public void run()
{
try
{
for (int i = 0; ; i++)
{
RequestData data = getRequestConfig();
if (data == null)
{
break;
}
server.execute(data, this);
output.flush();
if (!data.isKeepAlive() || !data.isSuccess())
{
break;
}
}
} catch (RequestException e)
{
webServer.lo