OSGi + спящий режим
-
20-08-2019 - |
Вопрос
Вместо того, чтобы разбрасывать действия с базой данных по четырем пакетам (osgi), каждый из которых выполняет немного разные действия.Я хочу создать (простой) пакет OSGi, который будет отвечать за все проблемы с сохранением данных.Я чувствую, что это не так просто, как кажется, из-за «уникального загрузчика классов для каждого пакета».Поэтому я был бы очень признателен, если бы кто-нибудь знал решение (решения) такого рода проблем.
Решение
(Если вы используете аннотации Hibernate)
Сохраните все загрузчики классов Entities, когда пакет Hibernate узнает об аннотированном классе.
Затем сделайте что-нибудь подобное, прежде чем создавать SessionFactory.
ClassLoad cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(yourClassLoader);
factory = cfg.buildSessionFactory();
}finally {
Thread.currentThread().setContextClassLoader(cl); // restore the original class loader
}
Другие советы
Я могу придумать два способа решения проблемы загрузки классов.
- Вы привязаны к определенной OSGi-фреймворку или хотите сохранить максимальную совместимость?Или вы можете использовать равноденствие для своей реализации?В Equinox есть механизм под названием Buddy Classloading.Это дополнение позволяет повысить видимость определенных классов между разными OSGi-Bundle.Если вас интересует эта тема, я хотел бы направить вас к этим двум статьям: Понимание того, как плагины Eclipse работают с OSGi, Eclipse — история двух виртуальных машин (и множества загрузчиков классов).
- Если вы предпочитаете оставаться независимым от реализации OSGi, вы можете рассмотреть возможность извлечения ваших классов, которые вы хотите сохранить, в отдельный пакет, от которого зависят как Hibernate-Bundle, так и другие ваши пакеты.Таким образом, все они имеют доступ к определению сохраняемых классов.
Только что нашел интересный метод в классе/api Bundle.
public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException
Это должно решить некоторые проблемы с загрузчиком классов?
Я собираюсь порекомендовать держаться подальше от загрузки классов-приятелей, поскольку это специфично для реализации Eclipse Equinox, и, по моему мнению, люди заставляют это работать, но они не понимают, почему, и каждый в конечном итоге становится другом всех остальных.Это мешает вам правильно понять, как работает загрузка классов OSGi и шаблоны, которые вам нужно использовать (загрузчики составных классов, загрузка контекстных классов, службы OSGi и т. д.) для работы с ней.
Если ваш пакет персистентности заранее знает, какие типы ему нужны для сохранения, тогда пакет может импортировать все необходимые пакеты (Require-Bundle — это зло), содержащие классы вашего домена.
Управление загрузчиком классов контекста (как в ответе Роджера) может помочь с Hibernate, хотя я бы предложил использовать что-то вроде Spring dm, чтобы скрыть это за службой OSGi.
Спящий режим поддерживает OSGi но это постоянные усилия.