Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用JNI的OSGi服务在使用中被注销时会发生什么?_Java_Java Native Interface_Osgi - Fatal编程技术网

Java 当使用JNI的OSGi服务在使用中被注销时会发生什么?

Java 当使用JNI的OSGi服务在使用中被注销时会发生什么?,java,java-native-interface,osgi,Java,Java Native Interface,Osgi,据我所知,OSGi服务可以随时注销,包括在使用中 考虑一个OSGi服务,它在内部进行长时间运行的JNI调用。当JNI调用正在执行时,OSGi将注销该服务 JNI调用是否允许中途完成或终止?如果它只是一个正常的非jni长时间运行的Java调用呢?是允许该调用完成执行,还是OSGi立即终止所有操作并注销 在这种情况下,预期的行为是什么?预期的行为是否取决于服务是否使用“跟踪器”加载 SG我认为,即使使用“正常”(非JNI)服务,OSGi也不会停止任何正在进行的处理。事实上,如果bundle在服务实例

据我所知,OSGi服务可以随时注销,包括在使用中

考虑一个OSGi服务,它在内部进行长时间运行的JNI调用。当JNI调用正在执行时,OSGi将注销该服务

JNI调用是否允许中途完成或终止?如果它只是一个正常的非jni长时间运行的Java调用呢?是允许该调用完成执行,还是OSGi立即终止所有操作并注销

在这种情况下,预期的行为是什么?预期的行为是否取决于服务是否使用“跟踪器”加载

SG

我认为,即使使用“正常”(非JNI)服务,OSGi也不会停止任何正在进行的处理。事实上,如果bundle在服务实例被注销(它不应该这样做)后以某种方式保留对它的引用,它仍然可以调用该对象上的方法(这些方法是否仍然有效完全取决于服务实现)

OSGi服务没有“魔力”。捆绑包生命周期只控制在服务注册表中注册和取消注册的内容。一旦您有了对服务实现的引用,它就只是简单的旧Java方法调用


所以,为了回答您的问题,除非捆绑包(或服务)本身做了任何事情来终止正在进行的活动,否则长时间运行的呼叫将结束。

谢谢,我自己的测试似乎证实了这一切。长时间运行的jni和非jni调用将继续运行,并且在注销服务后仍可以调用服务方法。依赖于能够在注销服务实例后调用服务方法是非常危险的。如果服务方法导致任何类加载发生(例如,通过沿着它以前没有出现过的代码路径),则类加载将失败,通常会导致调用线程随之停止。处理此问题的“正确”方法是让系统在继续注销服务之前等待您的长时间运行呼叫完成。@James Branigan:完全同意。我写了“不应该那样做”。我只是想指出,在幕后没有任何魔法可以强制执行这些规则。您必须展示一些规则(或者更好地使用服务跟踪器和依赖注入等工具,而不是手动查找和引用服务)