Glassfish 2.1 EJB 3.0 Предоставление локального EJB другим приложениям, работающим в том же домене / jvm

У меня есть существующий проект, который мне нужно настроить по-другому. Это должно происходить без серьезных изменений кода. Я действительно надеюсь, что смогу как-то сделать это только с конфигурацией. Последние 2-3 дня я читал все, что мог найти по этому вопросу. Я понимаю загрузчики классов Glassfish и то, что мне доступно.

У меня есть текущий пример проекта, в котором есть EJB, определяющий интерфейс @Local. Ejb развертывается внутри ejb-модуля как ejb-модуль в домене glassfish. Теперь я пытаюсь найти способ для другого приложения, которое было развернуто в качестве уха в том же домене, чтобы иметь возможность получить доступ к этому EJB через его локальный интерфейс.

Я прочитал документацию, в которой говорится, что это невозможно. Затем я видел сообщения здесь, в StackOverflow, и другие сообщения в Интернете, в которых говорилось, что это возможно. Но я не могу найти фактического решения.

Проведя расследование, я понял, что @Local EJB не регистрируется на jndi (по крайней мере, согласно журналам), если я использую браузер JNDI Glassfish, я также не вижу его видимым. Поэтому для меня логично, что либо это невозможно, либо развертывание проекта EJB ошибочно, и мне нужно каким-то образом раскрыть его.

@Remote - это возможность, если это можно сделать по ссылке, и без накладных расходов на производительность. Но предпочтительный метод, разрешающий доступ к @Local EJB, действительно является крайней необходимостью.

Кто-нибудь знает, что мне нужно сделать, чтобы предоставить @Local EJB другому приложению? Или это просто невозможно?

Я использую Glassfish 2.1 с EJB 3.0

Если Glassfish 2.1 может обрабатывать EJB 3.1, я был бы готов перейти на него, если бы он предоставлял такую ​​возможность, но я сомневаюсь, что это так просто.

Пожалуйста помогите. Спасибо.

Я добавляю награду. Чтобы завершить награду, потребуется запустить 2 ушных приложения в одном домене, где A.ear содержит @Local EJB, который также используется приложением в B.ear.


person guyumu    schedule 22.11.2012    source источник
comment
Дополнительная информация: docs.oracle.com/cd/E18930_01 /html/821-2418/beadh.html#beadl. Это для Glassfish 3.1, но в документации указано то же самое для 2.1. Я не могу заставить это работать.   -  person guyumu    schedule 22.11.2012
comment
возможно, вам следует объяснить свою мотивацию для этого, но, как вы уже упоминали, здесь есть другие темы, посвященные той же проблеме, я просто согласен с ответом jtahlborn: stackoverflow.com/questions/5681197/ (и не будет пытаться сделай это)   -  person Peter Butkovic    schedule 29.11.2012


Ответы (1)


Ссылка, которую дал вам @Peter, почти решает вашу проблему. (ссылка)

Для решения проблемы @Xavier необходимо использовать один трюк: предоставить common.jar обоим ушам одной и той же версии (загруженной одним и тем же загрузчиком классов). Если вы это сделаете, исключение приведения класса не будет сгенерировано, и вы сможете использовать ejb с локальным интерфейсом.

Для этого вам нужно поместить common.jar в папку glassfish / domains / domain1 / lib (замените domain1 своим доменным именем). Таким образом, этот jar будет загружен загрузчиком общих классов Glassfish.

Я провел быстрый тест с Eclipse и Glassfish 3 со следующей структурой:

package com.example;

JarShared
 - @Local class Server

EarServer
 - EjbServer
    - @Stateless class ServerBean implements Server

EarClient
 - EjbClient
    - @Stateless @LocalBean class ClientBean

Поиск из ClientBean:

InitialContext ic = new InitialContext();
Server server = (Server) ic.
    lookup("java:global/EarServer/EjbServer/ServerBean!com.example.Server");

Я не получил ClassCastException, и я мог вызвать образец метода из ServerBean.

Важные заметки:

  • и EarServer, и EarClient не должны содержать JarShared в папке lib, они должны повторно использовать тот, который находится в папке lib домена.
  • не забудьте перезапустить Glassfish после добавления к нему JarShared.
  • чтобы оба проекта ejb скомпилировались, вы должны добавить JarShared к их путям сборки, но не более того

Если у вас есть вопросы, оставьте комментарий.

person MeTTeO    schedule 30.11.2012
comment
Привет, большое спасибо за ответ. Я думаю, что ключевым моментом, о котором вы здесь упоминаете, является папка domains / lib. Думаю, раньше я пытался использовать папку domains / lib / applibs, но вижу, в чем проблема. Я попробую это решение сегодня и сообщу / проголосую :-) Спасибо! :) - person guyumu; 04.12.2012
comment
Я провел небольшое тестирование и снова прочитал ваш пост :) Я вижу, что вы использовали Glassfish 3.1 :) Я думаю, что уловил тенденцию, что Glassfish 3 добавил поддержку для этого, и я нахожусь в погоне за диким гусем на Glassfish 2.1 : / К сожалению, я не могу перейти на Glassfish 3. - person guyumu; 07.12.2012
comment
Проверьте это: glassfish.java.net/javaee5/ejb/ - это правила об именах JNDI, специфичных для GF2 (GF3 также использует их из соображений совместимости, я думаю) - person MeTTeO; 07.12.2012