Servicemix - проблемы загрузки классов OSGi со встроенными зависимостями - PullRequest
0 голосов
/ 27 сентября 2011

Я занимаюсь разработкой проекта с несколькими пакетами OSGi, развернутыми в ServiceMix (сборник FuseESB, v. 4.3.1).Проблема заключается в том, что один из этих пакетов подключается к EJB в WebLogic, поэтому он встраивает weblogic.jar.

Решение работает, однако требуется хитрость.Пакет экспортирует сервис Spring через OSGi.Эта служба импортируется в другой пакет, который является точкой входа в систему.Когда из этого пакета был вызван сервис, веблогические классы были невидимы.Трюк заключается в том, чтобы обернуть сервис Spring в следующем аспекте, который временно переключает загрузчик классов:

    public Object profileInventory(ProceedingJoinPoint pjp) throws Throwable {
    Object output = null;
    ClassLoader clOld = Thread.currentThread().getContextClassLoader();

    try {
        Thread.currentThread().setContextClassLoader(pjp.getTarget().getClass().getClassLoader());
        output = pjp.proceed();
    } finally {
        Thread.currentThread().setContextClassLoader(clOld);
    }
    return output;
}

Как я понял, сервис вызывается с загрузчиком классов из входного комплекта, а не с загрузчиком классов из комплекта, который встраивает weblogic.и для этого загрузчика классов встроенные классы зависимостей не видны.В аналогичном случае экспортированный сервис Spring может использовать частный импорт и частные пакеты из своего пакета, но со встроенными jar-файлами это не так.быть видимым только тогда, когда вызов происходит от встраивания пакета (или с помощью трюка с загрузчиком классов), или есть что-то еще, что нужно указать при встраивании пакета, что я забыл сделать?

Я использую maven-bundle-плагин

        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <configuration>
                <instructions>
                    <Bundle-Name>${pom.artifactId}</Bundle-Name>
                    <Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
                    <Embed-Dependency>
                 weblogic;scope=*,
                    </Embed-Dependency>

1 Ответ

0 голосов
/ 27 сентября 2011

Я сталкивался с подобной проблемой при использовании удаленного удаленного взаимодействия ранее.Spring любит динамически загружать классы с помощью потокового загрузчика классов контекста, который не всегда хорошо работает в OSGi.

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

Например, если комплект использует SimpleRemoteStatelesSessionProxyFactory, он должен вызывать метод setBeanClassLoader () .

...