私はこの会社で、完全な Karaf コンテナーを OSGi デプロイ (pax:provision を使用してフレームワークとして分点を使用する Pax-runner を使用) に置き換えることを目的とした機能に取り組んでいます。私がやっている手順は次のとおりです。
1 - 「pax:provision」の代わりにpax:directoryを実行して、 config.iniというファイルを生成します。ここには、バンドルの開始順序が含まれています。
2- pax:directoryによってフォルダーに集約されたすべてのバンドルをkaraf ルート ディレクトリにコピーします。
3- config.ini からバンドルを読み取り、jar バンドルを開始する osgi バンドルである Java プロジェクト (KarafProvisioner) を作成しました。電源ロジックを以下に示します。
@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 はデフォルトで、logf4j、jetty などの約 50 のバンドルで起動します。この機能とともに、KarafProvisioner をデフォルトとして起動します。
pax-runner を使用すると、すべてのバンドルが正常に起動します。そして、システムは正常に動作します。
すべてのバンドルが ACTIVE モードであるため、このアプローチは部分的に機能しますが、問題は次のとおりです。
アプリケーションは 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 を使用してすべてが ACTIVE になることを考慮してください。
2-インターフェイスと datastax である Cassandra の問題は、OSGi のものと何らかの関係がありますか? 2-データベースが開始され、これをDbeaverとcqlshで確認しました。)
3-インターフェイスを変更せずにこの問題を解決する方法はありますか? 多分いくつかの設定を使用していますか?
繰り返しになりますが、 pax-runner ( equinoxシンプル バンドルを使用) を使用すると、すべて正常に動作します。Karaf コンテナーにアプリケーションをデプロイしようとすると、問題が発生します。