Пакет с Infinite Loop на Equinox OSGI Framework

У меня есть пакет, который работает с бесконечным циклом на Equinox OSGI Framework. Из-за этого пакета я не могу запустить новый пакет при повторном запуске фреймворка. Как я могу остановить этот пакет в этой ситуации?

Вот команда, которую я набираю для запуска фреймворка:

java -jar org.eclipse.osgi_3.9.0.v20130529-1710.jar -console

Он показывает это сообщение бесконечно:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
...........

Ответ на этот вопрос также поможет ответить на вопрос, как остановить пакет OSGI во время выполнения метода и разрешено это или нет.


person Traveling Salesman    schedule 23.07.2013    source источник


Ответы (1)


Я предполагаю, что ваш пакет вошел в бесконечный цикл в своем методе BundleActivator.start и, следовательно, завязал обратный вызов OSGi. Очевидно, это не то, что вы должны делать! У вас нет другого выбора, кроме как выключить JVM, возможно, принудительно.

Теперь проблема состоит в том, чтобы предотвратить повторный автоматический запуск пакета при следующем запуске OSGi. Самый простой способ обеспечить это — удалить каталог «storage», в котором OSGi запоминает список пакетов, запущенных в последний раз. К сожалению, расположение каталога хранилища зависит от свойства конфигурации, и вы не указали, как вы настроили OSGi. По умолчанию для Equinox используется configuration/org.eclipse.osgi, поэтому попробуйте удалить его. Вы также можете попробовать запустить с -clean.

Что касается того, как остановить пакет OSGi во время выполнения метода: вы, конечно, можете остановить пакет, и это приведет к выполнению его stop метода. Вы можете делать в этом методе все, что хотите: в общем, вы должны стремиться очистить все, что вы создали в методе start. Однако, если у вас есть неуправляемый поток, вы ничего не можете сделать, поскольку Java не предлагает способа убить поток, он предлагает только совместный метод interrupt.

OSGi не может изменить фундаментальные правила Java, поэтому неуправляемые потоки представляют собой такую ​​же большую проблему в OSGi, как и в любом другом приложении Java.

person Neil Bartlett    schedule 23.07.2013
comment
Спасибо, Нейл... Допустим, у меня есть пакет, который предоставляет Hello World Message Infinite Times в одном из своих методов.... Теперь проблема, с которой я столкнулся, заключается в том, что я не могу вызвать stop(), пока этот метод не завершит выполнение (что невозможно), так как же мне это сделать? - person Traveling Salesman; 24.07.2013
comment
Надеюсь, у вас уже есть другая удобная тема, из которой вы можете позвонить stop. Но особого смысла нет. Просто убейте JVM. - person Neil Bartlett; 24.07.2013
comment
Я убил JVM и удалил каталог. Теперь все в порядке. Но теперь мне нужно продемонстрировать, как остановить пакет во время выполнения метода. Я хочу сделать это, чтобы увидеть, будет ли процесс полностью убит или что произойдет. - person Traveling Salesman; 24.07.2013
comment
Поэтому я собираюсь запустить пакет из другого потока и позволить основному потоку остановить пакет. Согласен? - person Traveling Salesman; 24.07.2013
comment
Да, я запустил бандл в другом потоке и смог заметить, что остановка этого бандла не остановит поток. Огромное спасибо. Вы заслуживаете больше голосов! - person Traveling Salesman; 24.07.2013
comment
Нити и бандлы не имеют никакой связи друг с другом, кроме той связи, которую вы создаете в своих методах активатора start и stop. - person Neil Bartlett; 24.07.2013