Как активировать пакет OSGI только при выполнении определенного условия? - PullRequest
1 голос
/ 07 мая 2020

Я немного новичок в OSGI и хочу следующее: активировать свой пакет только при выполнении некоторых предварительных условий (которые, кстати, мы получаем из собственной библиотеки, но это уже другая история). AFAIK это может быть достигнуто с помощью @Reference DS, но я не понимаю полностью. Я имею в виду, что если я напишу что-то вроде этого перед моим @Activate DS:

@Reference
public AnotherService as

@Activate
public void activate() {
   //some code 
}

, это на самом деле означает, что мой пакет не будет активирован, пока не будет активирован AnotherService. А можно ли написать в AnotherService или в своей связке что-то вроде этого?:

@Activate
public void activate() {
   if (condition){
       deactivate()
   }
   //some code 
}

@Deactivate
public void deactivate() {
//some code
}

Насколько я понимаю, это невозможно. Тогда возникает вопрос: как я могу контролировать активацию своего пакета или его ссылок в зависимости от определенных условий? Т.е. я хочу, чтобы мой пакет был либо активирован, когда условие выполнено ( до активации ), либо деактивировано, когда нет. Мне это не подходит: «просто сделай if-statement, если он не удовлетворен, ничего не делай, но все равно активируйся», потому что «activiy» этого пакета очень ресурсоемкий. Может, у меня просто совершенно неправильное представление об OSGI.

1 Ответ

2 голосов
/ 07 мая 2020

Это не то, что вам следует делать. Ваш пакет всегда должен быть активирован до тех пор, пока он может быть разрешен (т. Е. Все его импорта и другие c зависимости удовлетворяются).

Фактически, если вы не кодируете OSGi на продвинутом уровне, вы вообще не следует писать BundleActivators. Если вы читаете учебник OSGi в 2020 году, в котором вам предлагается написать BundleActivator, прекратите читать ... этот учебник - мусор.

Вам следует использовать компоненты Declarative Services. Компонент - это объект, управляемый OSGi, жизненный цикл которого может быть привязан к доступности службы. Например:

@Component
public class MyComponent implements MyService {

  private final AnotherService service;

  @Activate
  public MyComponent(@Reference AnotherService service) {
    this.service = service;
  }

  @Override
  public void doSomething() {
    // ...
  }
}

В этом примере экземпляр MyComponent будет создан и опубликован как услуга типа MyService только , когда услуга типа AnotherService доступен. Вы сможете вызвать AnotherService через последнее поле service. Это обязательная ссылка на службу, которая используется в DS по умолчанию, но также возможно создание дополнительных и динамических ссылок c (т. Е. Ссылок, которые могут повторно связываться с другими экземплярами службы в течение срока службы вашего компонента), но не Не беспокойтесь об этих вариантах использования до тех пор, пока вы не изучите OSGi.

...