我有一个 Java 应用程序,我已经开发了一两年了。我想创建一个非常简单的接口(interface)集(以后可能会增加复杂性),我可以用它来从另一个 JVM(例如 MATLAB)控制我的 Java 应用程序。
我假设 RMI 是执行此操作的最佳方法,但我不确定,因为我对此几乎一无所知。
快速学习 RMI 的最佳方法是什么?
假设我想使用这样的界面:
interface Application {
public void setLoggingEnabled(boolean enable);
public boolean isLoggingEnabled();
}
我如何使用 RMI 通过此接口(interface)在两个 JVM 之间实现桥接?我必须了解有关阻塞/线程/同步的哪些信息才能使这项工作正常进行?
一种快速的方法是使用 Spring。这并不(必然)意味着使用大量 XML 配置:可以通过编程方式使用 Spring 的 RMI 支持类。
两个关键类是:
这样做的一个好处是您只需要编写接口(interface)的实现,然后可以使用 RmiServiceExporter
使其可用。同时,在客户端,使用 RmiProxyFactoryBean
为您提供一个实现该接口(interface)的代理对象。就客户端代码而言,它使用接口(interface)的“真实”实现,但代理为您执行 RMI 调用。 RMI 的使用是透明的。
为了说明这有多快,我刚刚使用您的界面编写了一个服务器和客户端。
我的接口(interface)实现是:
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