我试图实现一个优雅的关闭钩子到我的OSGi的应用程序。我在一个捆绑包中实现它,因为我没有直接访问启动器源。
下面是课堂:
/**
* Shutdown Hook for OSGi
* Based On: https://stackoverflow.com/a/32216407/5284104
*/
@Component()
public class ShutdownHookActivator{
@Activate
public void start(ComponentContext cc, BundleContext bc, Map<String,Object> config) {
Thread hook = new Thread() {
@Override
public void run() {
System.out.println("Stopping OSGi Framework.");
try {
Framework systemBundle = bc.getBundle(0).adapt(Framework.class);
systemBundle.stop();
System.out.println("Waiting up to 2s for OSGi shutdown to complete...");
systemBundle.waitForStop(2000);
} catch (Exception e) {
System.err.println("Failed to cleanly shutdown OSGi Framework: " + e.getMessage());
e.printStackTrace();
}
}
};
System.out.println("Installing shutdown hook.");
Runtime.getRuntime().addShutdownHook(hook);
}
}
但无论何时启动它,它都会返回一个错误:
错误:[Shutdown HookActivator(8)]激活方法[start]未找到;组件将失败
但是当我从start方法中删除参数时,一切都正常了。所以现在我很困惑,我看到了@Activate方法的参数由OSGi框架自动注入的例子(http://enroute.osgi.org/services/org.osgi.service.component.html),以及其他只是空的,所以从我的理解来看,这应该是可行的。(感觉在OSGi中,一切都与运气有关)
通过使用DS注释并获取框架BundleContext来实现这一点的正确方法是什么?这有可能吗?
编辑:OSGi环境:BndTools(Aquet启动器?)ApacheFelixSCR2.0。12(OSGi DS注释-6.0.1)源代码可以在这里看到:https://github.com/Jafre13/ISS-Product
编辑2:自动生成的ShutdowHookActivator。xml:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0" name="dk.sdu.sso.sred.utils.ShutdownHookActivator" activate="start">
<implementation class="dk.sdu.sso.sred.utils.ShutdownHookActivator"/>
</scr:component>
清单:
Manifest-Version: 1.0
Bnd-LastModified: 1512410080758
Bundle-ManifestVersion: 2
Bundle-Name: dk.sdu.sso.sred
Bundle-SymbolicName: dk.sdu.sso.sred
Bundle-Version: 0.0.0.201712041754
Created-By: 1.8.0_151 (Oracle Corporation)
Import-Package: javax.security.auth.x500,junit.framework,org.junit,org
.xml.sax,org.xml.sax.ext,org.xml.sax.helpers
Private-Package: dk.sdu.sso.sred.cmd,dk.sdu.sso.sred.lingpipe,dk.sdu.s
so.sred.api;version="1.0.0",dk.sdu.sso.sred,com.aliasi.test.unit.xml,
com.aliasi.test.unit.io,com.aliasi.suffixarray,com.aliasi.test.unit.u
til,com.aliasi.test.unit.crf,com.aliasi.matrix,com.aliasi.test.unit.s
entences,com.aliasi.test.unit,com.aliasi.tag,com.aliasi.test.unit.hmm
,com.aliasi.chunk,com.aliasi.coref,com.aliasi.spell,com.aliasi.test.u
nit.chunk,com.aliasi.test.unit.features,com.aliasi.coref.matchers,com
.aliasi.lm,com.aliasi.test.unit.coref,com.aliasi.cluster,com.aliasi.f
eatures,com.aliasi.test.unit.symbol,com.aliasi.io,com.aliasi.test.uni
t.tokenizer,com.aliasi.sentences,com.aliasi.test.unit.coref.matchers,
com.aliasi.test.unit.spell,com.aliasi.test.unit.corpus,com.aliasi.uti
l,com.aliasi.dca,com.aliasi.symbol,com.aliasi.test.unit.lm,com.aliasi
.dict,com.aliasi.test.unit.tag,com.aliasi.corpus,com.aliasi.classify,
com.aliasi.test.unit.dca,com.aliasi.tokenizer,com.aliasi.test.unit.cl
assify,com.aliasi.crf,com.aliasi.test.unit.cluster,com.aliasi.stats,c
om.aliasi.test.unit.stats,com.aliasi.test.unit.dict,com.aliasi.test.u
nit.matrix,com.aliasi.test.unit.suffixarray,com.aliasi.xml,com.aliasi
.hmm,dk.sdu.sso.sred.utils,org.apache.felix.service.command,org.osgi.
framework;version="1.8",org.osgi.service.component;version="1.3"
Provide-Capability: osgi.service;objectClass:List<String>="dk.sdu.sso.
sred.api.SRedAPI",osgi.service;objectClass:List<String>="dk.sdu.sso.s
red.cmd.ModelCommands",osgi.service;objectClass:List<String>="dk.sdu.
sso.sred.cmd.SRedCommands"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.ee;filter:="(&(osgi.e
e=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/dk.sdu.sso.sred.SRed.xml,OSGI-INF/dk.sdu.s
so.sred.cmd.ModelCommands.xml,OSGI-INF/dk.sdu.sso.sred.cmd.SRedComman
ds.xml,OSGI-INF/dk.sdu.sso.sred.utils.ShutdownHookActivator.xml
Tool: Bnd-3.5.0.201709291849
从清单上可以明显看出你的问题发生的原因。您将OSGiAPI作为私有包。这意味着类被嵌入到jar中,因此它们与框架和DS使用的规范类不兼容。
所以解决方案是确保您只使用私有包来嵌入真正需要嵌入的内容。永远不要将其用于OSGiAPI包。你需要有一个导入才能让它们工作。
问题内容: 当我使用OSGi声明式服务在片段内创建组件时,该组件未激活,但主机捆绑包中的组件被激活。我想念什么吗?我的片段具有用于主机捆绑包符号名称的正确文件条目。 我以这种方式宣布一个伴侣 问题答案: 因为从不启动捆绑包片段,所以永远不会激活其中的仅已解析声明式服务组件。该规范特别指出片段中的Service- Component标头(将注释转换为标头)将被忽略。 您可以使声明性服务适用于片段,但
问题内容: 因此,我不断在多个服务器上收到此烦人的错误(它是一个警告,因此我将忽略它,但我需要该功能) 警告:curl_setopt()[function.curl- setopt]:启用safe_mode或在第56行的/home/xxx/public_html/xxx.php中设置了open_basedir时,无法激活CURLOPT_FOLLOWLOCATION 我将如何通过SSH解决此问题?
我试图调试一个问题,这个问题似乎是由我的一个OSGi组件在框架关闭期间的奇怪行为引起的。 当我试图通过调用 我的组件被停用,但由于某种原因,它被重新激活,然后再次停用。第二个激活/停用周期会导致一些奇怪的行为,因为组件注册了一个“UI容器”,这会导致应用程序的UI在关闭期间闪烁。 我的问题是什么会导致第二个激活/停用周期? 我正在使用声明性服务Maven、ApacheFelix和SCR插件。 下面
我对这个(OSGI)真的是新手,试图做简单的例子。我不能让懒惰的修辞奏效。我知道有一些解决这些问题的蓝图,但在开始之前,我认为学习一些基础知识是很好的。 好吧,我已经改变了我的代码,但仍然没有运气。 外部应用程序,install bundles,启动framework,然后只启动DataServiceClient Bundle。不能访问任何bundle类。 以下是DataServiceClient
当实例的试用期结束时,Navicat Monitor 需要令牌以继续监控该实例。令牌可以作为永久许可证或订阅购买。若要管理你的令牌并许可你的实例,请前往“配置”->“激活令牌密钥和许可实例”。 【注意】永久许可证和订阅方案不能在同一个 Navicat Monitor 上使用。在更改激活方法之前,你需要取消激活令牌密钥或退出你的 Navicat ID。 永久许可证 如果你购买了永久许可证,你将收到一
本文向大家介绍Visual Studio 2019 Professional 激活方法详解,包括了Visual Studio 2019 Professional 激活方法详解的使用技巧和注意事项,需要的朋友参考一下 Visual Studio 2019 Professional 下载地址 > https://visualstudio.microsoft.com/zh-hant/thank-you-