在EJB Application(在Glassfish上运行)和Swing应用程序之间实现两阶段提交协议

时间:2013-03-14 20:19:19

标签: swing glassfish ejb jms 2phase-commit

我在EJB服务器上运行了一个Glassfish应用程序,它将数据存储在我称为全局数据库的MySQL数据库上。 我有两个确切的远程Swing应用程序,它们是使用EJB's访问RMI的独立应用程序。如果连接丢失,他们有自己的本地数据库。

我的目标是实施两阶段提交协议,即让一个参与者作为协调者,其他参与者作为参与者。

我能想到的一种方法是使用JMS实现,即跨队列发送消息,使远程客户端监听这些消息并采取适当的措施。 我这样做是在一个Swing应用程序的Buttonclick上发送消息。 问题是,即使很难实现MessageListeneronMessage()方法也不会收到任何其他客户的消息。

每个远程客户端都设置了以下属性:

 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服务器并访问我已配置的connectionFactoryQueue

是否因为只允许在服务器上运行的应用程序接收消息而不是远程应用程序?

欢迎任何有关2台PC拓扑的建议。

2 个答案:

答案 0 :(得分:1)

为此,我们使用JMS在这些系统之间交换消息,即一个充当协调器的人将通过在队列上发送消息来启动该过程,而其他人将通过在队列上再次发回消息来响应。

答案 1 :(得分:0)

由于您使用的是EJB,因此您可以使用JTA来管理transcation,它是两阶段提交协议的标准实现,JMS也支持JTA。 以下是我的步骤:

  1. 将trans-attribute配置为Required / Mandatory / Supports,具体取决于您的需要。
  2. 客户端中的
  3. 通过从EJB服务器查找jndi来获取UserTransaction。
  4. 从客户端开始交易。
  5. 在客户端提交/回滚交易
  6. 这就是所谓的“客户所有者交易设计模式”。我建议你阅读这本书 javatransactionsbook