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

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

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

Один из способов, который я мог придумать, заключался в использовании JMS т.е. отправить сообщение через очередь и заставить удаленных клиентов прослушивать эти сообщения и предпринимать соответствующие действия. Я делаю это, отправляя сообщение на Buttonclick одного из приложений 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 ПК приветствуются.

2 ответа

Решение

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

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

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

Это так называемый "шаблон дизайна транзакции владельца клиента". Предлагаю вам прочитать книгу javatransactionbook

Другие вопросы по тегам