2

我有一个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服务器并访问我已经配置的connectionFactory和。Queue

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

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

4

2 回答 2

1

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

于 2013-03-19T09:31:32.317 回答
0

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

  1. 将跨属性配置为必需/强制/支持,取决于您的需要。
  2. 在您的客户端中,通过从 EJB 服务器查找 jndi 来获取 UserTransaction。
  3. 从客户端开始交易。
  4. 在客户端提交/回滚事务

这就是所谓的“客户所有者交易设计模式”。我建议你阅读本书javatransactionsbook

于 2013-03-15T09:02:48.687 回答