【问题标题】:A bundle with Infinite Loop on Equinox OSGI FrameworkEquinox OSGI 框架上的无限循环捆绑包
【发布时间】:2013-07-23 19:19:48
【问题描述】:

我有一个在 Equinox OSGI 框架上无限循环运行的包。由于这个包,当我再次运行框架时,我无法启动一个新包。在这种情况下如何停止此捆绑包?

这是我输入的启动框架的命令:

java -jar org.eclipse.osgi_3.9.0.v20130529-1710.jar -console

它无限显示这条消息:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
...........

回答这个问题还有助于回答如何在 OSGI 包执行方法时停止它,以及是否允许这样做。

【问题讨论】:

    标签: osgi equinox osgi-bundle


    【解决方案1】:

    我假设您的包在其BundleActivator.start 方法中进入了无限循环,因此绑定了OSGi 回调。显然这不是你应该做的事情!!您别无选择,只能关闭 JVM,也许是强制关闭。

    现在的问题是在下次启动 OSGi 时阻止捆绑包再次自动启动。确保这一点的最简单方法是删除 OSGi 记住上次运行时启动的包列表的“存储”目录。不幸的是,存储目录位置受配置属性的影响,您没有指定如何配置 OSGi。 Equinox 的默认值为configuration/org.eclipse.osgi,因此请尝试删除它。您也可以尝试使用-clean 运行。

    关于如何在执行方法时停止 OSGi 包:您当然可以停止 ,这将导致其 stop 方法执行。您可以在该方法中做任何您喜欢的事情:一般来说,您应该致力于清理您在 start 方法中创建的任何内容。但是,如果您有一个失控的线程,那么您基本上无能为力,因为 Java 没有提供杀死线程的方法,它只提供了一个协作的 interrupt 方法。

    OSGi 无法改变 Java 的基本规则,因此线程失控在 OSGi 中和在任何其他 Java 应用程序中一样是一个问题。

    【讨论】:

    • 谢谢尼尔...假设我有一个捆绑包,它在其中一种方法中提供“Hello World”消息无限次...。现在我面临的问题是我无法调用停止() 除非这个方法完成执行(这是不可能的),那么我应该怎么做呢?
    • 希望您已经有了另一个方便的线程,您可以从中调用stop。但是没有多大意义。只需杀死 JVM。
    • 我确实杀死了 JVM,并删除了目录。现在一切都很好。但现在我需要演示如何在运行方法时停止包。我想这样做是为了看看进程是否会被完全杀死或者会发生什么。
    • 所以我要从另一个线程启动包,让主线程停止包。同意吗?
    • 是的,我在另一个线程中启动了包,我注意到停止这个包不会停止线程。非常感谢。你应该得到更多的选票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2014-03-02
    • 2014-06-26
    • 2011-03-09
    • 2014-02-03
    • 2016-02-09
    相关资源
    最近更新 更多