Реализовать протокол двухфазной фиксации между приложением 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. Вот мои шаги:
- Сконфигурируйте атрибут trans в значение Required/Mandatory /Supports, зависит от ваших потребностей.
- в вашем клиенте получите UserTransaction путем поиска jndi с сервера EJB.
- начать транзакцию с клиента.
- зафиксировать / откатить транзакцию на стороне клиента
Это так называемый "шаблон дизайна транзакции владельца клиента". Предлагаю вам прочитать книгу javatransactionbook