Статьи

Кластеризация сессионных компонентов с сохранением состояния с помощью GlassFish 3.1

Кластеризация станет следующей большой темой для версии GlassFish 3.1. Впереди, и вы уже можете выбрать свою сборку RC4, чтобы немного поэкспериментировать. Есть несколько скринкастов для кластеризации HTTPSession. Арун Гупта сделал отличное введение в кластеризацию GlassFish 3.1, высокую доступность и централизованное администрирование . Таким образом, вы можете получить базовое представление о кластеризации, узлах, экземплярах и доменах. До сегодняшнего дня документация по всем этим функциям все еще очень ограничена. Но это изменится в ближайшие несколько недель. Вот что я сделал, чтобы получить сценарий отработки отказа для Stateful Session Bean, работающий с двумя экземплярами на одном узле.

подготовка
Как всегда: получите GlassFish 3.1 RC4. Создайте кластер (например, demoCluster) и добавьте два экземпляра (instance1 и instance2). Теперь запустите свой домен и кластер. Напишите простой EJB (например, MySessionBean) и заставьте его реализовать RemoteInterface (например, MySessionBeanRemote). В моем примере есть простой бизнес-метод String showInstance (), который распечатывает фактический работающий экземпляр:

Logger.getLogger(MySessionBean.class.getName())
.log(Level.INFO, "Running on: {0}",
System.getProperty("com.sun.aas.instanceName"));

Заверните свой ejb-jar в ухо и разверните его. Обязательно проверьте «Доступность» во время развертывания. Это позволяет выполнять репликацию в памяти из одного экземпляра в другой.
Идите и проверьте, зарегистрирован ли EJB в ваших экземплярах:

%AS_INSTALL%/bin/asadmin list-jndi-entries demoCluster

Вы должны увидеть что-то вроде этого:

node2:
java:global: com.sun.enterprise.naming.impl.TransientContext
[...]net.eisele.cluster.MySessionBeanRemote#
net.eisele.cluster.MySessionBeanRemote: javax.naming.Reference
[...]

node1:
java:global: com.sun.enterprise.naming.impl.TransientContext
[...]
net.eisele.cluster.MySessionBeanRemote#
net.eisele.cluster.MySessionBeanRemote: javax.naming.Reference
[...]

До сих пор это не было проблемой. Это простой EJB без каких-либо других настроек. Теперь давайте пойдем и напишем несколько клиентов.

Автономный клиент
Исходя из старой школы, я начинаю с автономного клиента без какой-либо «магии». Создайте проект Java (например, StandaloneClient), добавьте основной класс (StandaloneClient) и добавьте% AS_INSTALL% / glassfish / lib / gf-client.jar в качестве зависимости. Убедитесь, что вы ссылаетесь на RemoteInterface (MySessionBeanRemote) как-то (Classpath или копирование его в исходный код вашего проекта).

// get a simple no argument constructor InitialContext
InitialContext ic = new InitialContext();
// use the global jndi name as lookup string
String lookup = "java:global/ClusterTestEar/ClusterTestEar-ejb/MySessionBean!net.eisele.cluster.MySessionBeanRemote";
//lookup the jndi name
MySessionBeanRemote myEjb = (MySessionBeanRemote) ic.lookup(lookup);
//call showInstance
myEjb .showInstance();

Все прямо вперед. Никакой магии здесь. По сравнению с большинством других серверов приложений необычно то, что вам не нужно ни указывать какие-либо свойства InitialContext, ни даже добавлять какую-либо магию кластера в строку поиска. Но как клиент узнает о моих экземплярах и портах? Это просто Вы должны указать их как параметры VM:

-Dcom.sun.appserv.iiop.endpoints=
127.0.0.1:23701,127.0.0.1:23700

Клиентский контейнер приложения
Молодежь, вероятно, недовольна автономным клиентом. Они привыкли к каким-то инъекциям и тому подобным аннотациям Хорошо. Вот так. Вы звоните в ACC. Самый простой способ его создания — позволить вашей IDE сделать это. NetBeans создает отличный проект для вас. Он также имеет основной класс, и вы можете просто:

// inject you ejb ...
@EJB
private static MySessionBeanRemote myEjb;
[...]
// and use it
myEjb .showInstance();

Отлично. Но здесь это идет. Сам NetBeans не имеет никакой поддержки развертывания кластера, но проект ACC был разработан для развертывания. Таким образом, даже если вам это не нужно, команда NetBeans «Выполнить файл» завершится неудачно. Таким образом, вы должны сделать это вручную. Первая часть — сообщить ACC, где найти удаленный EJB.
Если вы не собираетесь писать сценарий на основе веб-старта (а это именно то, что мы НЕ собираемся делать :)), вы можете просто выбрать копию% AS_INSTALL% \ domains \ clusterdomain \ config \ sun-acc.xml и положить его в папку ваших проектов. Вам нужно отредактировать его и сделать так, чтобы он отражал ваши экземпляры:

<target-server name="MYNODE" address="localhost" port="23701"/>
<target-server name="MYNODE" address="localhost" port="23700"/>

Сценарий% AS_INSTALL% \ bin \ appclient.bat / sh поможет вам выполнить ACC. Создайте jar из вашего проекта appclient и запустите его:

appclient -client %YOUR_DIST_FOLDER%\ClusterAppClient.jar -xml %YOUR_DIST_FOLDER%\sun-acc.xml

Готово. Теперь у вас все работает. Новая школа и старая школа способ доступа к удаленным EJB.

Кластеризация / Отработка отказа
Теперь давайте проверим возможности отработки отказа. Добавьте второй вызов бизнес-метода своим клиентам и сделайте все, чтобы клиент сделал паузу между ними. Либо для автоматического продолжения через несколько секунд, либо при нажатии клавиши.
Теперь давайте запустим клиент. Он распечатывает, к какому экземпляру подключен этот клиент. Предположим, это говорит вам что-то вроде этого:

Running on: instance1

Теперь переключитесь на консоль asadmin и введите необходимую команду stop-instance, чтобы закрыть экземпляр, к которому подключен клиент. В таком случае:

asadmin> stop-instance instance1

Если он остановлен, нажмите клавишу или дождитесь продолжения клиентского сценария. и видите, что второй вызов перенаправлен на второй узел:

Running on: instance2

Отработка отказа работает. Отлично ? Спасибо Oracle Ченгу и Тиму за ответы на мои вопросы во время исследования!

Дополнительное чтение
Oracle GlassFish Server 3.0.1 Руководство по разработке приложений Глава 11 Разработка Java-клиентов
Сообщество GlassFish FAQ по EJB

От http://blog.eisele.net/2011/02/clustering-stateful-session-beans-with.html