EJB, удаленное взаимодействие между двумя серверами приложений (glassfish) - PullRequest
3 голосов
/ 20 марта 2011


Я хочу иметь компонент Foo в хосте A, который вводится аннотацией @EJB в компонент Bar в хосте B.
Оба эти хоста являются отдельными автономными экземплярами Glassfish-v3.
При чтении документов Glassfish я обнаружил много информации, некоторые из которых звучали немного противоречиво.
Я понял, что каждому bean-компоненту присвоено глобальное имя jndi, и понял, как он построен, Каков синтаксис для переносимых глобальных имен JNDI? . Я также понял, что объявление Foo в Bar должно быть чем-то в этом роде (при условии, что FooRemote - это удаленный бизнес-интерфейс Foo, а fooejb - его модуль): @EJB(lookup=java:global/fooejb/FooRemote) FooRemote foo, это основан на это .
Что я не могу понять, так это где я говорю хосту A и хосту B, чтобы они познакомились друг с другом.
Я видел много примеров для клиентов приложений и серверов приложений, но я не смог найти пример для такого сценария.
В упоминается этот вопрос a sun-web.xml и Global-JNDI, но я думаю, что это не EJB3.1 (так как это не Portable JNDI), и я не понимаю, где должен находиться этот sun-web.xml ( Я хотел бы избежать этого, если смогу).
В основном это отличается двумя способами:

  1. Нет опции -Dorg.omg.CORBA.ORBInitialHost = param (насколько я вижу)
  2. Любое решение, конечно, должно предусматривать включение третьего хоста C, с которым A и B взаимодействуют для различных целей.

У меня сильное чувство, что я здесь упускаю что-то простое, и я очень ценю указатели на то, что мне не хватает.
Кстати, я бы хотел как можно больше избегать файлов дескрипторов и тому подобного и оставлять большую информацию о аннотациях и только ip хоста для настройки на сервере.

Edit:
Я думаю, что другой интересный аспект этого вопроса - как балансировка нагрузки используется в этом аспекте, то есть, скажем, у меня есть серверы A1 и A2, которые одинаковы, как будет происходить балансировка нагрузки при маршрутизации запроса от B или A1 или A2

Edit2:
Я думаю, что может не иметь отношения к ejb 3.1, но связано с тем, как дать возможность двум серверам приложений видеть реестр jndi друг друга. Я думаю, что это не связано с ejb 3.1, так как похоже, что подобная проблема существует в 3.0 с Global не переносимым jndi.
Я полагаю, что некоторые настройки на каждом сервере приложений позволят мне настроить, какие другие «соседи» должны запрашивать удаленные bean-компоненты jndi.
Надеюсь, что это дает ключ к кому-то там.

Спасибо
Еффий

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

Что касается балансировки нагрузки EJB, вы можете посмотреть этот блог:

http://www.techpost.info/2010/12/ejb-load-balancer_7304.html

2 голосов
/ 23 марта 2011
  • Как указано на одной из страниц, на которые вы ссылаетесь , при использовании кластера вам не требуется дополнительная настройка, чтобы это работало.Если вам требуется балансировка нагрузки и т. Д., Я думаю, что проще настроить кластер, чем делать это вручную.
  • sun-web.xml идет прямо рядом с web.xml в WEB-INF, если вы развертываетеэто как веб-проект в .war-файле.
  • Я думаю, вы должны быть в состоянии сделать это правильно, используя: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#cross-appserverremoteref и http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#mappingRemoteejbdependency
  • Я бы подумал тамДолжен быть простой способ настройки коннектора EJB или адаптера ресурсов в самой себе, используя консоль администрирования или редактирование server.xml.Но сейчас я не могу найти такую ​​вещь.
0 голосов
/ 20 июня 2012

Мы используем удаленные EJB-компоненты, и они отлично работают.

Сначала вам понадобится EJB на "Хосте А", который реализует интерфейс, класс которого присутствует на обоих хостах.

//For host A + B
public interface FooClass {
    public void theMethod();
}

//Only for host A
@Stateless
public class FooClassImpl implements FooClass {
    public void theMethod(){//Code goes here}
}

Затем вам нужно будет создать (на хосте B) glassfish-web.xml в вашем каталоге WEB-INF, где вы укажете, где находится удаленный EJB:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <ejb-ref>
    <ejb-ref-name>RemoteEJBName</ejb-ref-name>
    <jndi-name>corbaname:iiop:<servername or IP>:3700#java:global/<projectname>/FooClassImpl!com.test.foo.FooClass</jndi-name>
  </ejb-ref>
</glassfish-web-app>

В точке инъекции на хосте B вам необходимо ввести EJB следующим образом:

@EJB(name = "RemoteEJBName")
private FooClass theFooClassInstance;

Я надеюсь, что это поможет.

...