Что происходит, когда служба OSGi, использующая JNI, не регистрируется во время использования?

Насколько я понимаю, OSGi-сервисы можно отменить в любое время, в том числе, когда они используются.

Рассмотрим службу OSGi, которая внутренне выполняет длительный вызов JNI. И пока этот вызов JNI выполняется, OSGi отменяет регистрацию службы.

Будет ли вызов JNI разрешен для завершения или прерван на полпути? Что, если бы это был обычный долгий Java-вызов, не относящийся к jni? Будет ли этому вызову разрешено завершить выполнение или OSGi немедленно завершит все и отменит регистрацию?

Каково ожидаемое поведение в таком случае? Зависит ли ожидаемое поведение от того, была ли служба загружена с помощью «трекера» или нет?

SG


person Community    schedule 17.03.2010    source источник


Ответы (1)


Я думаю, что даже с «обычными» (не JNI) сервисами OSGi не остановит уже идущую обработку. На самом деле, если пакет каким-то образом сохраняет ссылку на экземпляр службы после того, как он был разрегистрирован (чего он не должен делать), он по-прежнему может вызывать методы для этого объекта (будут ли они работать или нет, полностью зависит от реализация услуги).

С сервисами OSGi не происходит «волшебства». Жизненный цикл пакета просто контролирует, что регистрируется и не регистрируется в реестре службы. Если у вас есть ссылка на реализацию службы, это просто старые вызовы методов Java.

Итак, чтобы ответить на ваш вопрос, если сам пакет (или служба) не предпримет никаких действий для прекращения текущей деятельности, длительный вызов завершится.

person Thilo    schedule 17.03.2010
comment
Спасибо, мои собственные тесты, кажется, подтверждают все это. Длительные вызовы jni и non-jni продолжают выполняться, и вызовы методов службы все еще могут быть выполнены после отмены регистрации службы. - person ; 17.03.2010
comment
Очень опасно полагаться на возможность вызова методов службы после отмены регистрации экземпляра службы. Если сервисный метод вызывает загрузку какого-либо класса (например, путем перехода по пути кода, в котором он не был раньше), загрузка класса завершится ошибкой, часто приводя к остановке вызывающего потока. «Правильный» способ справиться с этим - заставить систему ждать завершения вашего длительного вызова, прежде чем продолжить отмену регистрации служб. - person James Branigan; 18.03.2010
comment
@Джеймс Браниган: Полностью согласен. Я же написал, что так делать нельзя. Я просто хотел указать, что за кулисами нет никакого волшебства, чтобы заставить следовать правилам. Вы должны проявить некоторую дисциплину (или, что еще лучше, использовать такие инструменты, как Service Trackers и Dependency Injection, вместо ручного поиска и ссылки на сервисы) - person Thilo; 18.03.2010