Я работаю над функцией, здесь, в компании, которая стремится заменить развертывание OSGi (которое теперь использует Pax-runner с равноденствием в качестве фреймворка, используя pax: provision), для полного контейнера Karaf.Вот шаги, которые я делаю:
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 .
Obs .
Я уже пытался создать файл functions.xml для автоматического развертывания приложения, но он не работал.
Я загружаю Karafс функцией веб-консоли, поэтому Karaf запускается по умолчанию примерно с 50 пакетами, такими как logf4j, jetty и так далее.Я запускаю свой 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.
2- Имеет ли проблема с Cassandra, интерфейсом и датастаксом какую-либо связь с OSGi? (Obs. 1- Интерфейс использует свойство из среды OSGi, чтобы узнать хост и порт базы данных Cassandra, и это свойство в порядке. 2- База данных запущена и проверяет это с помощью Dbeaver и cqlsh .)
3- Есть ли способ решить эту проблему без изменения интерфейса?Может быть, с использованием какой-либо конфигурации?
Опять же, с использованием pax-runner (с equinox простых комплектов) все работает отлично.Проблема возникает, когда я пытаюсь развернуть приложение в контейнере Karaf.