我正在公司开发一项功能,旨在用完整的 Karaf 容器替换 OSGi 部署(现在使用 Pax-runner,Equinox 作为框架,使用 pax:provision)。以下是我正在执行的步骤:
1 - 运行pax:directory而不是“pax:provision”,以生成一个名为config.ini的文件,其中包含包的启动顺序。
2-我将所有通过pax:directory聚合到文件夹中的包复制到 karaf 根目录。
3- 我创建了一个 Java 项目 (KarafProvisioner),一个 osgi 包,它从 config.ini 读取包,并启动 jar 包。电源逻辑如下所示。
@Activate
protected void activate(BundleContext pBundleContext) throws IOException, InvalidSyntaxException, BundleException
{
LOG.info(LogConstants.ACTIVATING_SERVICE, this);
while (getActiveBundles(pBundleContext) < pBundleContext.getBundles().length - 2)
{
startAllBundles(pBundleContext);
}
File bundleList = new File(BUNDLE_LIST);
String bundleListString = FileUtils.readFileToString(bundleList, "UTF-8");
Matcher regexBundleNameMatcher = regexBundleName.matcher(bundleListString);
while (regexBundleNameMatcher.find() == true)
{
String jarBundle = regexBundleNameMatcher.group(0);
Matcher regexBundleSymbolicNameMatcher = regexBundleSymbolicName.matcher(jarBundle);
String bundle = "";
if (regexBundleSymbolicNameMatcher.find())
{
bundle = regexBundleSymbolicNameMatcher.group(0);
}
if (true
&& !bundle.contains(FELIX_SCR)
&& !bundle.contains(FELIX_WEBCONSOLE)
&& !bundle.contains(EQUINOX_CM)
&& !bundle.contains(COMMONS_IO)
&& !bundle.contains(JAVAX_MAIL)
&& !bundle.contains(OPS4J_PAX_LOGGING_API)
&& !bundle.contains(JETTY_GROUP_ID))
{
startBundle(pBundleContext, jarBundle, bundle);
long bundleID = findBundle(pBundleContext, bundle);
BUNDLE_STATUS status = getBundleStatusByID(pBundleContext, bundleID);
while (status == BUNDLE_STATUS.STARTING)
{
status = getBundleStatusByID(pBundleContext, bundleID);
}
}
}
//Start Devenv Configurator
// startBundle(pBundleContext, bundleNameDevenvConfigurator, DEVENV_CONFIGURATOR);
//Continue verifying until all the possible bundles have been active
while (getActiveBundles(pBundleContext) < pBundleContext.getBundles().length - 5)
{
startAllBundles(pBundleContext);
}
LOG.info(LogConstants.ACTIVATED_SERVICE, this);
}
有了这个 KarafProvisioner 捆绑包,我可以启动所有捆绑包,并且我放置了一个循环来继续尝试启动所有内容。一切看起来都正常,因为系统拥有的所有 350 个捆绑包都是ACTIVE。
观测值。
我已经尝试生成 features.xml 来自动部署应用程序,但它不起作用。
我使用 webconsole 功能启动 Karaf,因此默认情况下,Karaf 以大约 50 个捆绑包启动,例如 logf4j、jetty 等。我将 KarafProvisioner 与此功能一起默认启动。
使用 pax-runner 所有的包都正常启动。并且系统运行良好。
这种方法部分有效,因为所有捆绑包都处于活动模式,但问题是:
该应用程序使用 Cassandra 数据库,带有一个封装所有操作的内部 java 项目,并创建一个通用接口来操作存储。使用 pax-runner 一切正常,但使用 Karaf 会显示此错误:
%PARSER_ERROR[Exception]ConfidentialInternalInterfaceExcpetion: Server overloaded. The query could not be executed at the specified priority level
at ConfidentialInternalInterfaceProject(ExceptionHandler.java:65)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:840)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:852)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:1041)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:1061)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:517)
at ConfidentialInternalInterfaceProject(StorageConfigurationBootstrap.java:105)
at ConfidentialInternalInterfaceProject(CilInitializer.java:182)
at ConfidentialInternalInterfaceProject(DevenvConfigurator.java:743)
at ConfidentialInternalInterfaceProject(DevenvConfigurator.java:53)
at ConfidentialInternalInterfaceProject(DevenvConfigurator.java:916)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:64169 (com.datastax.driver.core.exceptions.BusyPoolException: [/127.0.0.1] Pool is busy (no available connection and timed out after 5000 MILLISECONDS)))
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84)
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:37)
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68)
at ConfidentialInternalInterfaceProject(PersistenceHandler.java:836)
... 11 common frames omitted
我的问题是:
1-我使用辅助包来加载所有剩余的包这一事实是否会影响系统的流量?考虑到使用 pax-runner 一切都变得活跃。
2- Cassandra的问题,接口和datastax,与OSGi的东西有什么关系吗?(Obs. 1-接口使用OSGi环境中的一个属性来了解Cassandra数据库的主机和端口,以及这个属性没问题。2-数据库已启动,并使用Dbeaver和cqlsh对此进行了检查。)
3-有什么方法可以在不修改界面的情况下解决这个问题?也许使用一些配置?
再次,使用pax-runner(带有equinox简单包)一切正常。当我尝试在 Karaf 容器中部署应用程序时,问题就出现了。