背景技术
在分布式综合管理应用开发平台(iMAP-MDP)中,基于消息的分布式平台(MDP)负责整个系统的消息传递。系统中其他的所有应用进程与平台建立连接,通过消息传递进行信息交互。在这种结构下,一般系统中的其他应用进程之间都不直接建立连接。在iMAP-MDP平台中,经常采用的一种客户端服务器结构是,客户端(或称前台)和服务器端(或称后台)都作为iMAP-MDP综合平台中的一个应用程序。参阅图1所示。
客户端的消息处理一般有两种:同步消息和异步消息。当客户端连接到MDP时,实际上是建立了两个与MDP的连接。同步消息处理客户端发送的同步请求,异步消息则处理客户端发送的异步请求和接收来自MDP的通知上报消息。异步消息不阻塞客户端的其他线程。
在同步请求的情况下,客户端发送一个请求消息到MDP,MDP将该消息转发给后台特定的任务进行处理,在处理过程中,客户端处于一个阻塞的等待进程,直到接收到后台返回的响应消息,客户端才继续执行下去。
在异步请求的情况下,客户端发送一个请求消息到MDP,然后继续其他的处理。当客户端异步消息处理模块接收到来自MDP的消息后,如果判断是请求消息,则发送到客户端的特定模块处理。如果判断不是请求消息,则遍历订阅了该消息的模块,每个模块根据消息内容进行上报消息的处理。
根据上述的MDP的特性,客户端如果要反映后台的进度,则客户端必须接收后台的执行情况,而这种执行情况的消息如果通过同步消息来处理,则服务器端的任务在执行过程中需不断地向客户端发送响应消息,中间部分的响应需特殊处理,最后发送的消息才是客户端真正需要的结果。这种方式可以称为分阶段响应的方式。采用这种方式有以下缺点:
(1)由于每个支持分阶段响应的服务器端都需要接口的支持,因此需要修改现有接口;
(2)客户端只能知道完成了几步,但初始情况下,不知道总的进度,因而不能真正反映服务器端的进度。
发明内容
本发明的目的在于提供一种基于消息的分布式平台的客户端反映任务进度的方法,以解决现有技术中存在客户端不能真正反映服务器端进度的问题。
为解决上述问题,本发明提供以下技术方案:
一种基于消息的分布式平台的客户端反映任务进度的方法,所述分布式平台利用同步消息接口和异步消息接口在客户端和服务器端之间传递消息;该方法包括步骤:
客户端启动一个可显示进度的等待窗口,并通过同步消息接口发送请求消息;
根据所述请求消息启动服务器端进行相应处理,并在处理过程中发送包含进度指示的通知上报消息;
所述客户端通过异步消息接口接收所述通知上报消息,分析其中的进度指示并显示进度。
其中:
通过在客户端和服务器端之间确定一个特定的消息号来反映服务器端进度的消息,客户端在启动等待窗口时订阅该特定的消息号,并在等待窗口关闭时取消订阅该特定的消息号。
当有多个客户端查询不同服务器端的进度指示消息时,服务器端在通知上报消息中指定接收者,由所述消息平台将该通知上报消息转发给该接收者,以保证一个进度指示仅发送到特定的客户端。
服务器端上报的进度指示中还包含当前登录的用户标识或客户端的唯一标识,客户端在接收到包含进度指示的通知上报消息时根据用户标识或客户端的唯一标识判断是否应为本客户端接收的通知上报消息,如果是则处理,否则丢弃。
服务器端每执行到一个进度点向客户端发送一个包含进度指示的通知上报消息,其中进度指示可为前进一步或多步。
本发明在服务器端处理过程中不断地通过通知上报消息发送进度指示,客户端通过异步消息接口接收进度指示并显示,因此本发明能够在用户界面上精确反映任务的执行情况,从而提高可用性。
具体实施方式
参阅图1所示,在这种体系结构中,客户端(或称“前台”)与服务器端(或称“后台”)之间不直接建立连接,而是通过MDP提供的功能(订阅、取消订阅(或称去订阅)、请求、响应)来实现消息的传递,前台可以通过同步请求和异步请求两种通讯接口与MDP通讯。如果前台发送一个同步请求,前台的消息处理模块一直处于等待响应的状态,由一个服务器端的任务进行相应任务的处理,直到处理完毕并返回响应消息,前台才继续进行工作。因此,在现有技术中,前台无法知道服务器端的运行进度,从而无法提供给用户任务的执行情况。
在前台发送同步消息后,由于服务器端返回的消息可能有两种,即在任务处理过程中,发送通知上报消息和响应消息。如果发送响应消息将导致前台获取请求结果和结束查询,而发送的通知上报消息则通过前台的异步消息接口发送到前台,因此,本发明利用这个特性来实现进度的反映。
本发明主要是通过服务器端在处理过程中,不断地发送包含进度指示的通知上报消息,前台通过异步消息接口接收进度指示,然后利用界面上的进度条提示给用户。
参阅图2所示,客户端显示服务器端进度实现过程如下:
步骤10:客户端启动一个可显示进度的等待窗口,并通过同步消息接口发送执行操作的请求消息。
在这种方案下,要求前台在执行一个长操作之前,一般先启动一个等待窗口,该窗口为可以显示进度的表示正在执行操作的有模对话框,然后发送一个请求消息,请求消息处于阻塞线程,等待窗口则处于另外一个线程,可以执行刷新和其他操作。
在启动等待窗口时,订阅一个特定的消息,该消息接收后台的进度,等到用户终止或同步查询结束时,取消订阅消息。为了实现这种方式,前后台之间要确定一个特定的消息号(如999888)专门作为反映进度的消息。在等待对话框启动时,订阅消息号999888,在等待对话框关闭时取消订阅消息号999888。
步骤20:MDP将所述请求消息转发给服务器端。
步骤30:服务器端根据请求消息进行相应的任务处理,并在处理过程中发送包含进度指示的通知上报消息。
如果该服务器处理的任务可以反映进度,则在处理该任务的开始,首先向客户端发送一个具有总长度指示的通知上报消息,服务器端在后续的处理过程中,每执行到一个进度点,则向前台发送一个通知上报消息。
步骤40:MDP转发所述通知上报消息。
MDP对通知上报消息的转发是一种广播方式,将发送给所有订阅了该消息的应用程序。
步骤50:客户端通过异步消息接口接收该通知上报消息,分析其中的进度指示并显示进度。
当客户端接收到进度消息时,如果进度指示大于0,则显示进度条,并设置总长度。如果进度指示等于0,表明无进度条;如果进度指示小于0,则进度条前进一步,如果灵活控制的话,可以用-1表示前进一步,-2表示前进两步,依次类推。
通过步骤10至50,即可在客户端显示服务端处理任务的进度,其显示效果参阅图3所示。
对于多个客户端同时在查询,则多个等待窗口同时接收到进度,由于MDP以广播方式转发包含进度指示的通知上报消息,这样可能引起不同应用程序的进度的混乱,因此还需要MDP另外支持一种消息的处理。
MDP提供的基本功能是请求、响应、通知上报。请求响应模式是将返回消息直接返回给调用者,而通知上报则是一种广播方式,将消息发送给所有订阅了该消息的应用程序。因此需要MDP提供一种功能,即是一种通知上报方式,而又有指定的接收者。在这种需求下,首先需要修改MDP的应用编程接口(API),增加一个方法,允许应用程序直接设置消息中的接收者,这样在服务端处理任务而发送此类通知上报时,可以指定接收者,接收者的获取可以利用安全模块获取客户端登录时的信息。当然还需要对MDP本身作一些修改,MDP是由一个读线程和一个写线程构成,现有技术中的读线程处理流程参阅图4A所示:
读到一个消息时,如果判断为订阅消息或取消订阅消息,则进行订阅或取消订阅处理,然后返回读消息;如果判断为响应消息,则查找请求者,如果有请求者则向接收者转发该消息,然后返回读消息,如果没有请求者则直接返回读消息;如果为通知上报消息,则查找订阅消息库,如果该消息无订阅者,则返回,如果有订阅者则向所有订阅者转发该消息。
修改接收者的原因就是让该流程进入到“没有请求者,但有接收者”的处理中,即将指定有接收者的通知上报消息作为特殊的响应消息进行处理。参阅图4B,本发明的读线程处理流程不同之处在于:
如果判断为响应消息,则查找请求者,如果找不到接收者,则根据接收者查找订阅消息库,如果有订阅且订阅者和接收者一致,则向该订阅者转发该消息,如果没有找到合适的订阅者,则丢弃该消息,然后返回读取消息。
这样,可以保证一个进度指示仅发送到特定的客户端,不会引起多个客户端进度指示的异常,这也是一种比较彻底的解决方法。该方法也可以进一步扩展到异步请求中。当然如果是异步请求,则由于界面上可以同时操作,可能会有多个进度条同时显示,这就需要一些扩展,如在进度指示中除了反映进度外,还可以附加请求的用户或模块等信息。
另外,如果系统中仅允许一个用户登录一次,则可利用该特性来比较简单地实现客户端反映后服务器端任务进度,这种方式不需要对MDP作修改。该方法为:
如果系统中仅允许一个用户登录一次,则前台在发送同步请求消息时,弹出一个对话框,订阅特定的消息;而服务器端在处理任务的过程中不停的发送进度指示,上报的进度指示包括:当前登录的用户名(或者一个前台的唯一标识)和进度(在消息的具体内容中包括用户名和进度,至于以什么形式体现,是数字还是字符串等,由具体系统的前后台约定即可)。在客户端接收到通知上报消息后,判断返回的登录用户名或唯一标识是否和当前客户端一致,如果一致,则显示进度,如果不一致,则不处理。
这种方式的缺点是如果多个客户端同时在进行请求操作,则可能接收到反映其他客户端进度的消息,这部分消息需要抛弃。由于客户端对每个通知上报消息都要进行比较处理,如果客户端非常多,会占用客户端大量的资源。因此,对于客户端不多的应用,可以采用这种方式。
通过上述方法,在现有的iMAP-MDP的结构下,能够在系统的前台提供准确的进度条,反映后台任务的执行进度,从而提高系统的可用性。