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

在EJB应用程序(在Glassfish上运行)和Swing应用程序之间实现两阶段提交协议,swing,glassfish,ejb,jms,2phase-commit,Swing,Glassfish,Ejb,Jms,2phase Commit,我有一个运行在Glassfish服务器上的EJB应用程序,它在MySQLDB上存储数据,我称之为全局DB。 我有两个完全相同的远程Swing应用程序,它们是使用RMI访问EJB的独立应用程序。他们有自己的本地数据库,以防失去连接 我的目标是实现两阶段提交协议,即让一个参与者作为协调员,其他参与者作为参与者 我可以想到的一种方法是使用JMS实现,即跨队列发送消息,让远程客户端侦听这些消息并采取适当的操作。 我这样做是因为我在Swing应用程序的一个按钮上发送消息。 问题是,即使我实现了Messag

我有一个运行在
Glassfish
服务器上的
EJB
应用程序,它在
MySQL
DB上存储数据,我称之为全局DB。 我有两个完全相同的远程Swing应用程序,它们是使用
RMI
访问
EJB的独立应用程序。他们有自己的本地数据库,以防失去连接

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

我可以想到的一种方法是使用
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
队列

是因为只有服务器上运行的应用程序才允许接收消息,而不允许远程应用程序接收消息吗


欢迎对2台PC的拓扑结构提出任何建议。

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

  • 根据需要,将trans属性配置为Required/Mandatory/Supports
  • 在客户端中,通过从EJB服务器查找jndi来获取UserTransaction
  • 从客户端启动事务
  • 在客户端提交/回滚事务

  • 这就是所谓的“客户机所有者转换设计模式”。我建议您阅读《javatransactionsbook》

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

    感谢您的回复。正如您所提到的,我们确实尝试过研究JTA,但最终我们通过实现JMS+队列来处理我们的任务。