Реализовать протокол двухфазной фиксации между приложением EJB (работающим на Glassfish) и приложением Swing.

У меня есть приложение EJB, работающее на сервере Glassfish, которое хранит данные в MySQL БД, которую я называю глобальной БД. У меня есть два удаленных приложения Swing, которые являются автономными приложениями, обращающимися к EJB's с помощью RMI. У них есть своя локальная БД на случай потери связи.

Моя цель — реализовать двухэтапный протокол фиксации, то есть сделать одного участника координатором, а других — участниками.

Один из методов, который я мог придумать, заключался в реализации с использованием JMS, то есть отправки сообщения через очередь и заставить удаленных клиентов прослушивать эти сообщения и предпринимать соответствующие действия. Я делаю это, отправляя сообщение о нажатии кнопки одного из приложений Swing. Проблема в том, что даже жесткий метод MessageListener, onMessage() не получает никакого сообщения для другого клиента.

Для каждого удаленного клиента установлены следующие свойства:

 props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
 props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
 props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
 props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
 props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

Это нужно для подключения к серверу Glassfish и доступа к connectionFactory и Queue, которые я уже настроил.

Это потому, что только приложения, работающие на сервере, могут получать сообщения, а не удаленные приложения?

Приветствуются любые предложения по топологии для 2 ПК.


person qwerty    schedule 14.03.2013    source источник


Ответы (2)


Для этого мы использовали JMS для обмена сообщениями между этими системами, т.е. одна действует как координатор, который инициирует процесс, отправляя сообщение в очередь, а другие отвечают соответствующим образом, снова отправляя сообщение в очередь.

person qwerty    schedule 19.03.2013

Поскольку вы используете EJB, вы можете использовать JTA для управления транзакцией, это стандартная реализация протокола двухэтапной фиксации, а JMS также поддерживает JTA. Вот мои шаги:

  1. настройте транс-атрибут на Required/Mandatory/Supports, зависит от того, что вам нужно.
  2. в вашем клиенте получите UserTransaction путем поиска jndi с сервера EJB.
  3. начать транзакцию с клиента.
  4. зафиксировать/откатить транзакцию на стороне клиента

Это так называемый «шаблон проектирования транзакций владельца-клиента». Я предлагаю вам прочитать книгу javatransactionsbook

person Harry.Chen    schedule 15.03.2013
comment
Благодарю за ваш ответ. Мы попытались изучить JTA, как вы упомянули, но в конечном итоге мы справились с нашей задачей, внедрив JMS + Queue. - person qwerty; 19.03.2013