在dispose侦听器中运行Job的IllegalStateException

时间:2015-09-02 15:04:21

标签: java eclipse rcp jobs eclipse-rap

我有一个dispose侦听器,它在widgetDisposed(DisposeEvent事件)方法中创建了一个Job。因此,当TreeViewer被处置时执行此方法导致在“清理作业”期间发生内部错误。在请求服务生命周期之外没有可用的上下文。此代码由RCP和RAP使用,在RCP app上正常工作.Issue与RAP一起使用。任何人都可以说明这有什么问题吗?

private void addDisposeListener() {
    treeViewer.getTree().addDisposeListener(new DisposeListener() {

        @Override
        public void widgetDisposed(DisposeEvent event) {
            Job CleanupJob = new Job("Cleanup Job") { //$NON-NLS-1$

                @Override
                protected IStatus run(IProgressMonitor arg0) {
                    doCleanup();
                    return Status.OK_STATUS;
                }
            };

            CleanupJob.setUser(false);
            CleanupJob.setSystem(true);
            CleanupJob.schedule();

        }
    });
}

1 个答案:

答案 0 :(得分:1)

似乎RAP尝试在当前UISession的上下文中执行在UI线程中创建的作业(请参阅rap.ui.workbench中的JobManagerAdapter)。但是,在您的特定情况下,Job应该在应用程序(" system")范围内执行。

如果窗口小部件由于会话终止而被处置,则此作业希望在会话终止后运行。这可以解释错误。

我建议您针对RAP提交bug并包含堆栈跟踪。

与此同时,您可以考虑使用Job进行清理的替代方法。例如,当清理是一项全局任务时,您可以拥有一个"清理代理"由dispose监听器和日程表异步清理通知。