我在EJB
服务器上运行了一个Glassfish
应用程序,它将数据存储在我称为全局数据库的MySQL
数据库上。
我有两个确切的远程Swing应用程序,它们是使用EJB's
访问RMI
的独立应用程序。如果连接丢失,他们有自己的本地数据库。
我的目标是实施两阶段提交协议,即让一个参与者作为协调者,其他参与者作为参与者。
我能想到的一种方法是使用JMS
实现,即跨队列发送消息,使远程客户端监听这些消息并采取适当的措施。
我这样做是在一个Swing应用程序的Buttonclick上发送消息。
问题是,即使很难实现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台PC拓扑的建议。
答案 0 :(得分:1)
为此,我们使用JMS在这些系统之间交换消息,即一个充当协调器的人将通过在队列上发送消息来启动该过程,而其他人将通过在队列上再次发回消息来响应。
答案 1 :(得分:0)
由于您使用的是EJB,因此您可以使用JTA来管理transcation,它是两阶段提交协议的标准实现,JMS也支持JTA。 以下是我的步骤:
这就是所谓的“客户所有者交易设计模式”。我建议你阅读这本书 javatransactionsbook