在RCP里面用自己的TaskView取代eclipse 的Progress View

星期六加了一天班,为ipass加上了前台客户端监控后台任务的功能。好在一次通过,没有连累到我的星期天。

ipass的的服务端接到客户端发来的请求后,生成的所有关于EMS的任务都要放到一个任务池中,有5个线程依次取出任务,完成任务,再到任务池中取任务。这样的好处是客户端发完命令后可以很快返回,继续作接下来的操作。如此设计的初衷是采用异步处理提高对用户的响应。任务在开始和结束都会给客户端返回信息,在大规模测试后发现,有的任务一直没有返回结束信息,用户不知道这个任务做到了什么程度,是不是做完了。

在如此情况下,开发监控后台进程执行任务的功能势在必行。首先在系统中保留5个执行线程的引用,通过这些引用,就可以取到正在执行的任务的信息,任务池中的任务全部是还没有作的任务,这样就可以取到未执行的任务,但是取的时候必须要加同步锁。任务的类中加入了控制执行进度的机制,可以按执行的程度计算出百分比。

前台是新加了一个View,用来显示后台任务的信息。本来的想法是直接利用eclipse的Progress View,而且它就在workbench这个plugin里面,ipass做成的rcp也带了这个plugin。但研究源码发现Progress View是显示Job Manager里面的Job信息,这就需要生成Job对象,但我的需求十分简单,并不需要这么复杂的类。想仿照eclipse的NewProgressViewer制作自己的Viewer,主要是想拥有进度条的功能,后来处于实际考虑,还是放弃,因为这么多的进度条显示势必会占用ipass本来就很紧张的内存。最后的实现就是用了一个TableViewer,分三列,图标,任务的名字,执行进度(用百分比表示)。在plugin.xml中添加这个View的extension,就是copy了eclipse ide ui那个plugin的Progress View的那一段,只是把它的class名字换成了我的Background Task。没有想到程序运行的时候,用鼠标双击程序任务栏的最右边,就会打开Background Task。在eclipse中这样的操作时打开Progress View。要有这个功能,还必须在构建rcp的WorkbenchWindowAdvisor时,设定configurer.setShowProgressIndicator(true)才可以。

关于任务信息的传递,一开始考虑的是拉模型,即客户端每隔1秒到服务器上取所有的任务信息。如果同时运行多个客户端,这样一来肯定会给服务器造成很大的负荷,而且到任务池中取信息时还要加同步锁。如果信息没有变化,这样的机制还会浪费很多的资源。对于推模型,即服务端任务每次有变化的时候,将变化的信息通知到各个客户端上,就会避免拉模型的这些问题,但是用户无法一开始获得全部的任务信息,因为只传递变化的信息。最后的实现为:用户打开Background Task 这个View时,客户端到服务器取所有的任务信息,而后不再主动取,服务端将变化的任务信息通知到各个客户端,每个任务都有唯一的hashcode,客户端再根据接收到的信息更新自己的Background Task View中的任务状态。

通过加入这一功能,可以很清楚地了解到任务执行慢的瓶颈在什么地方,这样程序的优化,改进就更有针对性,也有说服力。

你可能感兴趣的:(eclipse,UI,xml,ide)