OSGi реальное преимущество - PullRequest
       49

OSGi реальное преимущество

0 голосов
/ 10 октября 2018

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

Вопрос, однако:

Зачем мне нужно перезапускать все зависимые пакеты при обновлении службы (внутри пакета)?

private void updateBundle(String f) {
    BundleContext mainBc = felix.getBundleContext();
    Bundle bundle = mainBc.getBundle(f);
    try {
        bundle.update();
    // if I don't do this, the services inside 'bundle' will NOT be updated
        PackageAdmin pa = mainBc.getService(mainBc.getServiceReference(PackageAdmin.class));
        pa.refreshPackages(mainBc.getBundles());
    // at this point all bundles were restarted
    } catch (BundleException e) {
        System.err.println("Error while updating  " + f);
        e.printStackTrace();
    }
}

Судя по тому, что все мои пакеты были перезапущены (или, по крайней мере, зависимые), какой смысл обновлять определения классов в пакете, поскольку все пакеты приложений будут stopped и started, сбрасывая все состояния и активные соединения?

Это похоже на перезапуск моего приложения из командной строки, так зачем мне osgi?

1 Ответ

0 голосов
/ 10 октября 2018

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

Вот почему вы хотите экспортировать пакет, содержащий класс интерфейса сервиса, изотличается от пакета реализации сервиса.Затем все сервисные пакеты и пакета реализации сервиса импортируют пакет из экспортирующего пакета.Затем, когда вы обновляете пакет реализации службы, вам не нужно обновлять пакеты, потребляющие службу.

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

...