0

私はこの会社で、完全な 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-データベースが開始され、これをDbeavercqlshで確認しました。)

3-インターフェイスを変更せずにこの問題を解決する方法はありますか? 多分いくつかの設定を使用していますか?

繰り返しになりますが、 pax-runner ( equinoxシンプル バンドルを使用) を使用すると、すべて正常に動作します。Karaf コンテナーにアプリケーションをデプロイしようとすると、問題が発生します。

4

0 に答える 0