Nano Hash - криптовалюты, майнинг, программирование

Принудительный запуск пакета OSGi дважды с разными конфигурациями

Я использую встроенный Felix в своем приложении. Приложение потенциально может работать с большим количеством плагинов, которые предоставляют аналогичный интерфейс IFoo. Существует реализация по умолчанию FooImpl Надеюсь, для большинства плагинов по умолчанию FooImpl можно использовать с определенными файлами конфигурации.

Я хотел бы динамически установить и запустить тот же пакет (с FooImpl), когда появится новый файл конфигурации. Я уже рассмотрел FileInstall, но понятия не имею, как его там применить.

ОБНОВЛЕНИЕ: последовательность развертывания. Баночка, содержащая FooImpl и IFoo, стабильна, но мне нужно горячее развертывание новых экземпляров, которые являются результатом загрузки нового файла .cfg в область FileInstall. Желаемое очень простое - пользователь загружает .cfg, появляется новый сервис (экземпляр FooImpl).

06.04.2013

Ответы:


1

Использование заводских конфигураций позволит вам создавать разные экземпляры FooImpl на основе разных конфигураций.

Например, в Declarative Services вы можете создать такой компонент, как

import org.apache.felix.scr.annotations.*;
import org.apache.sling.commons.osgi.PropertiesUtil;

@Component(metatype = true, 
        name = FooImpl.SERVICE_PID,
        configurationFactory = true, 
        specVersion = "1.1",
        policy = ConfigurationPolicy.REQUIRE)
public class FooImpl implements IFoo
{
    //The PID can also be defined in interface
    public static final String SERVICE_PID = "com.foo.factory";

    private static final String DEFAULT_BAR = "yahoo";
    @Property
    private static final String PROP_BAR = "bar";

    @Property(intValue = 0)
    static final String PROP_RANKING = "ranking";

    private ServiceRegistration reg;

    @Activate
    public void activate(BundleContext context, Map<String, ?> conf)
        throws InvalidSyntaxException
    {
        Dictionary<String, Object> props = new Hashtable<String, Object>();
        props.put("type", PropertiesUtil.toString(config.get(PROP_BAR), DEFAULT_BAR));
        props.put(Constants.SERVICE_RANKING,
            PropertiesUtil.toInteger(config.get(PROP_RANKING), 0));
        reg = context.registerService(IFoo.class.getName(), this, props);
    }

    @Deactivate
    private void deactivate()
    {
        if (reg != null)
        {
            reg.unregister();
        }
    }
}

Ключевые моменты здесь

  1. Вы используете компонент типа configurationFactory
  2. В методе активации вы читаете конфигурацию, а затем на ее основе регистрируете службу.
  3. При деактивации вы явно отменяете регистрацию службы
  4. Затем конечные пользователи создадут файл конфигурации с именем <pid>-<some name>.cfg. Затем DS активирует компонент.

Затем вы можете создать несколько экземпляров, создав файл конфигурации (например, с помощью File Install) с именем <pid>-<some name>.cfg, например com.foo.factory-type1.cfg.

См. JdbcLoginModuleFactory и связанный с ним config для одного из таких примеров.

Если вы хотите добиться того же с помощью простого OSGi, вам необходимо зарегистрировать ManagedServiceFactory< /а>. См. JaasConfigFactory для одного такого примера.

Ключевые моменты здесь

  1. Вы регистрируете экземпляр ManagedServiceFactory с PID конфигурации в качестве свойства службы.
  2. В ManagedServiceFactory (строка pid, свойства словаря) обратный вызов регистрирует экземпляры FooImpl на основе свойств конфигурации.
08.04.2013

2

Похоже, вы хотите иметь только один пакет с установленным FooImpl, но зарегистрировать несколько сервисов IFoo, по одному для каждой конфигурации. Посмотрите на Declarative Services и используйте заводские конфигурации с Config Admin, чтобы установить несколько конфигураций для компонента DS.

06.04.2013
  • Не могли бы вы предоставить более подробную информацию. Я добавил комментарии по развертыванию - как сервис должен выглядеть в системе, особенно я не могу понять, как появление нового файла .cfg (управляемого FileInstall) приведет к появлению нового экземпляра FooImpl 07.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..