Equinox OSGI框架上的无限循环束

Equinox OSGI框架上的无限循环束,osgi,equinox,osgi-bundle,Osgi,Equinox,Osgi Bundle,我有一个在Equinox OSGI框架上运行无限循环的包。由于这个捆绑包,我无法在再次运行框架时启动新捆绑包。在这种情况下,如何停止此捆绑 以下是我键入的启动框架的命令: java -jar org.eclipse.osgi_3.9.0.v20130529-1710.jar -console 它无限地显示了这条信息: Hello World! Hello World! Hello World! Hello World! Hello World! ........... 回答这个问题也有助于回

我有一个在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 bundle执行方法时停止它,以及是否允许这样做。

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

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

关于如何在OSGi捆绑包执行方法时停止它:您当然可以停止捆绑包,这将导致执行其
stop
方法。您可以在该方法中执行任何您喜欢的操作:通常,您应该致力于清理在
start
方法中创建的任何内容。然而,如果你有一个失控的线程,那么你基本上什么也做不了,因为Java没有提供杀死线程的方法,它只提供了一个协作的
中断
方法


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

谢谢Neil…假设我有一个包,它在其中一个方法中无限次地提供“Hello World”消息…现在我面临的问题是我无法调用stop()除非这个方法完成了执行(这是不可能的),那么我应该怎么做呢?希望你已经有了另一个线程,可以从中调用
stop
。但没什么意义。我确实杀了JVM,并删除了目录。现在一切都好了。但是现在我需要演示如何在bundle运行方法时停止它。我想这样做是为了看看进程是否会被完全终止,或者会发生什么。因此,我将从另一个线程启动捆绑包,让主线程停止捆绑包。同意吗?是的,我在另一个线程中启动了捆绑包,我能够注意到停止这个捆绑包不会停止线程。非常感谢。你应该得到更多的选票!