RCP产品异常:Job found still running after platform shutdown. Jobs should be canceled

RCP 工程打开时异常信息:

Job found still running after platform shutdown.  Jobs should be canceled by the plugin that scheduled them during shutdown: ... ...
-----------------------------
分析发现时程序用的一个UIJob,在workbench非正常关闭时,UIJob还在运行,于是就有了上面的异常,替换成WorkbenchJob,就会正常。
-------
WorkbenchJob时一个专门的UIJob类,和UIJob的主要区别:在允许作业被调度和运行前,WorkbenchJob检测Workbench是否正在运行。

WorkbenchJob它使用作业更改监听器来确保:当作业已经完成时,在WorkbenchJob中包含的preformDone方法也被调用。

WorkbenchJob是UIJob的一种更安全的形式。WorkbenchJob会自己检测Workbench是否在运行,当Workbench关闭时,WorkbenchJob强制终止用户界面的更新。

WorkbenchJob源码贴一下:(关键是本身对PlatformUI.isWorkbenchRunning()的调用)

public abstract class WorkbenchJob extends UIJob {

    public WorkbenchJob(Display jobDisplay, String name) {
        super(jobDisplay, name);
        addDefaultJobChangeListener();
    }

    public WorkbenchJob(String name) {
        super(name);
        addDefaultJobChangeListener();
    }


    private void addDefaultJobChangeListener() {
        addJobChangeListener(new JobChangeAdapter() {
            public void done(IJobChangeEvent event) {
                //Abort if it is not running
                if (!PlatformUI.isWorkbenchRunning()) {
                    return;
                 }
                if (event.getResult().getCode() == IStatus.OK) {
                      performDone(event);
                
            }
        });
    }

    public void performDone(IJobChangeEvent event) {
        //Do nothing by default.
    }

    public boolean shouldSchedule() {
        return super.shouldSchedule() && PlatformUI.isWorkbenchRunning();
    }

    public boolean shouldRun() {
        return super.shouldRun() && PlatformUI.isWorkbenchRunning();
    }

}


猜你喜欢

转载自niub.iteye.com/blog/1783801