我有一个 Java 应用程序,我已经开发了一两年了。我想创建一组非常简单的接口(以后可能会增加复杂性),我可以使用它从另一个 JVM(例如 MATLAB)控制我的 Java 应用程序。
我假设 RMI 是执行此操作的最佳方法,但我不确定,因为我对此几乎一无所知。
快速学习 RMI 的最佳方法是什么?
假设我想使用这样的界面:
interface Application {
public void setLoggingEnabled(boolean enable);
public boolean isLoggingEnabled();
}
如何使用 RMI 实现两个 JVM 之间的桥梁?为了使这项工作正常进行,我需要了解哪些有关阻塞/线程/同步的知识?
实现此目的的一种快速方法是使用 Spring。这并不(必然)意味着使用大量 XML 配置:Spring 的 RMI 支持类可以通过编程方式使用。
两个关键类是:
-
RmiServiceExporter http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/remoting/rmi/RmiServiceExporter.html使对象可以远程访问。
-
RmiProxyFactoryBean http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/remoting/rmi/RmiProxyFactoryBean.html访问远程对象。
这样做的一个优点是您只需要编写接口的实现,然后就可以使用RmiServiceExporter
。同时,在客户端,使用RmiProxyFactoryBean
为您提供一个实现该接口的代理对象。就客户端代码而言,它正在使用接口的“真实”实现,但代理会为您执行 RMI 调用。 RMI 的使用是透明的。
作为一个示例,说明这有多快,我刚刚使用您的界面编写了服务器和客户端。
我的接口实现是:
public class ApplicationImpl implements Application {
private boolean enable;
@Override
public void setLoggingEnabled(boolean enable) {
this.enable = enable;
}
@Override
public boolean isLoggingEnabled() {
return enable;
}
}
服务器端代码为:
RmiServiceExporter exporter = new RmiServiceExporter();
exporter.setService(new ApplicationImpl());
exporter.setServiceInterface(Application.class);
exporter.setServiceName("application");
exporter.afterPropertiesSet();
客户端代码为:
RmiProxyFactoryBean pfb = new RmiProxyFactoryBean();
pfb.setServiceInterface(Application.class);
pfb.setServiceUrl("rmi://localhost/application");
pfb.afterPropertiesSet();
Application app = (Application) pfb.getObject();
System.out.println(app.isLoggingEnabled());
app.setLoggingEnabled(true);
System.out.println(app.isLoggingEnabled());
正如预期的输出:
false
true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)