Ява ее | ejb3 | отправка во время выполнения - PullRequest
1 голос
/ 09 ноября 2008

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

String bean = 'some/Bean';
String meth = 'doStuff';

//lookup the bean
Object remoteInterface = (Object) new InitialContext().lookup(bean);

//search the method ..
// foreach (methods)
// if method == meth, method.invoke(bean);

компоненты должны быть распределены по нескольким серверам приложений, а все компоненты должны вызываться удаленно.

Есть намеки? конкретно я делаю не хочу:

  1. Внедрение зависимости
  2. включение специфических для приложения интерфейсов ejb в диспетчере (см. Выше)
  3. веб-сервисы, которые напрасно расходуют вычислительную мощность, вся эта хрень xml

Можно ли загрузить удаленный интерфейс ejb3 по сети (если да, то как?), Чтобы я мог кэшировать интерфейс в какой-то хэш-карте или чем-то в этом роде.

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

спасибо за любую помощь

(кстати, нетбобы и стеклянная рыба)

Ответы [ 4 ]

1 голос
/ 09 ноября 2008

ejb3 звонки используют RMI. RMI поддерживает удаленную загрузку классов, поэтому я бы посоветовал разобраться в этом.

также, JMX mbeans поддерживает полностью нетипизированные удаленные вызовы. так что, если бы вы могли использовать mbeans вместо сессионных компонентов, это могло бы сработать. (Например, JBoss поддерживает ebeb3-подобные mbeans с некоторыми пользовательскими аннотациями).

наконец, многие серверы приложений поддерживают вызовы CORBA, а CORBA поддерживает нетипизированные вызовы методов.

0 голосов
/ 20 января 2009

Вы должны использовать отражение для этого, и это очень просто сделать. Предполагая, что вы ищете пустой метод с именем meth :

Object ejb = ctx.lookup(bean);
for (Method m : ejb.getClass().getMethods()) {
    if (m.getName().equals(meth) && m.getParameterTypes().length == 0) {
        m.invoke(service);
    }
}

Если вы ищете сигнатуру определенного метода, просто измените тест m.getParameterTypes () соответствующим образом, например, для метода с одним параметром String вы можете попробовать:

Arrays.equals(m.getParameterTypes(), new Class[]{String.class})

А затем передать массив Object [] с фактическими аргументами в вызов m.invoke ():

m.invoke(service, new Object[]{"arg0"})
0 голосов
/ 16 января 2009

Это невозможно сделать. Вы всегда получите исключение «класс не найден». Это, на мой взгляд, самый большой недостаток EJB / Java. Вы теряете некоторые из Dynamcis, потому что возможности метаязыка ограничены.

EJB3 поддерживает RMI / IIOP, но не RMI / JRMP (стандартный RMI), поэтому динамическая загрузка классов не поддерживается. Вы теряете некоторую общность Java, но получаете другие функции, такие как возможность общаться о транзакциях и безопасности.

0 голосов
/ 11 ноября 2008

Возможно, вы сможете использовать java.rmi.server.RMIClassLoader для удаленной загрузки классов. Вам также необходимо загрузить все классы, которые удаленный сервис возвращает или выдает.

...