Как выполнить методы активации и деактивации пакета OSGI в одном потоке - PullRequest
1 голос
/ 29 мая 2020
• 1000 сложное Windows -message-l oop, т.е. пока правда l oop, поэтому, чтобы не блокировать другие связки, активируется в отдельном потоке. К сожалению, я заметил, что для запуска 2 функций в методе деактивации мне нужно запустить их в том же потоке, в котором были запущены 3 функции в методе активации. Проще говоря, мне нужно быть уверенным, что методы активации и деактивации моего пакета выполняются в одном и том же потоке, но при этом, чтобы активация этого пакета была отделена (в собственном потоке) от других пакетов.

Мой вопрос: как это реализовать?

Я не гуру параллелизма в Java, я тоже пытался просто вызвать этого исполнителя в методе deactivate, но я не Я не знаю, как это сделать с одной запускаемой задачей, так как в деактивации мне нужно только вызвать 2 функции, а в активировать только 3 функции, и никакие другие вызовы выполняться не должны.

UPD : извините, я забыл упомянуть, что в другом пакете есть процедура, которая в определенных ситуациях вызывает context.getBundle(0).stop(), чтобы вызвать деактивацию для всех пакетов. Если я хочу просто добавить ту же процедуру отправки в метод deactivate, что и в activate, то в такой ситуации я мог бы ясно видеть, что эти 2 функции из метода deactivate моего пакета в теле отправки не были вызваны.

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Это звучит как очень распространенная проблема. Я бы просто дал понять, что вы используете поток, и используете методы в Thread, которые были разработаны для этого. При активации вы запускаете поток, при деактивации вы его прерываете. Ваш основной l oop отслеживает статус прерывания и выполняет ваши деактивированные функции после его прерывания. После прерывания лучше всего присоединиться к потоку, чтобы гарантировать, что ваш метод activate() не вернется до того, как фоновый поток завершит выполнение ваших деактивированных функций.

После выхода из фреймворка (остановка пакета 0) необходимо остановить все пакеты , и остановленный пакет деактивирует свои компоненты, все должно работать.

 public class Foo extends Thread {

      @Activate   void activate()   { start(); }
      @Deactivate void deactivate() throws Exception { interrupt(); join(); }

      public void run() {

            while(!isInterrupted()) try {
              ... your 3 function loop
            } catch( InterruptedException e) {
              break;
            }
            ... 2 deactivate functions
      }
  }
0 голосов
/ 29 мая 2020

Просто сделайте другого исполнителя. Submit в deactivate. Поскольку это однопоточный исполнитель, он будет гарантировать, что только один поток обрабатывает оба.

Единственный вопрос - как надёжно завершить работу исполнителя. Обычно после деактивации компонент должен закрыть все свои ресурсы.

...