【问题标题】:Starting OSGI Declarative Services causing thread error启动 OSGI 声明式服务导致线程错误
【发布时间】:2014-09-24 02:48:51
【问题描述】:

我有一个需要两个数据库连接的 RCP 3.7 应用程序,每个数据库的代码都在一个单独的包中。以前数据库启动是在 Activator.start() 方法中完成的。我对代码进行了大量重构,将数据库启动移动到两个声明式服务中。这实现了打破捆绑包之间的紧密耦合和过度包暴露的目标(几乎所有内容都被导出)。

我现在面临的挑战是这两个服务启动不够快,工作台加载并且我遇到线程冲突。我将两个服务都设置为立即=真。捆绑包的启动顺序是 eclipse.osgi 为 -1(默认),equinox.ds 和 equinox.common 为 2,core.runtime 为默认值。我已经尝试为我的捆绑包添加起始级别,但它没有帮助,所以删除它们。

关于如何确保数据库在服务返回之前启动有什么想法或建议?

【问题讨论】:

  • 您是否尝试过在清单中设置Bundle-ActivationPolicy: lazy?看看this post 使用声明式服务的延迟捆绑激活。
  • 感谢您的建议。我已经将该选项设置为惰性。很好的链接,我现在知道为什么设置它!

标签: eclipse osgi declarative-services


【解决方案1】:

看起来您正在从 DS 激活线程中访问 SWT。请使用 Display.asyncExec 从其他线程访问 SWT 代码。请参阅 PlatformUI.getWorkbench 以访问显示。

【讨论】:

  • 令人印象深刻!我不知道您是如何从 DS 转到 SWT 的,但您是对的。我将 Display.getDefault().getSystemCursor(SWT.CURSOR_WAIT) 更改为 PlatformUI.getWorkbench().getDisplay().getSystemCursor(SWT.CURSOR_WAIT) 问题得到纠正!
  • 是“Eclipse RCP”和“线程违规”导致我到达那里。无论如何,您可能应该将代码包装到 PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable...) 中,以确保它在 UI 线程上运行并且不会阻塞当前线程。但是,这也很大程度上取决于您对颜色所做的工作。您也不应该使用过于昂贵的操作来阻塞 UI 线程。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2013-10-09
  • 2018-05-20
  • 1970-01-01
  • 2011-09-03
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多