我目前正在开展一个涉及广泛使用 Java RMI 的项目,我想知道是否有人知道有关它的任何好的资源。
我目前发现的材料的问题是它通常已经过时(如Java 1.3)和/或半完成。我什至很乐意买一本关于它的书,但在亚马逊上看,所有的书都像是 7 岁了。
因此,如果有人知道任何好的资源、书籍或好的示例实现,我会非常有兴趣了解它们。
我目前正在开展一个涉及广泛使用 Java RMI 的项目,我想知道是否有人知道有关它的任何好的资源。
我目前发现的材料的问题是它通常已经过时(如Java 1.3)和/或半完成。我什至很乐意买一本关于它的书,但在亚马逊上看,所有的书都像是 7 岁了。
因此,如果有人知道任何好的资源、书籍或好的示例实现,我会非常有兴趣了解它们。
RMI Hello World看起来不错。当然,这仍然是一个简单的例子,所以也许关于 RMI 性能/可扩展性的提示会很有用,因为您已经熟悉 RMI。
Java.RMI 这些年来几乎没有什么变化,所以大部分旧文档仍然可以参考。请注意,如果您使用的是 Java 5.0 版本,则需要编译 RMI 存根,这是一项重大变化。大多数人已经离开 RMI 并接受了River(以前称为 Jini)的分布式系统。
如果您仍在考虑继续使用 RMI,那么我建议您阅读Oracle 文档或在他们的论坛上发布您的问题。
至于书籍…… William Grosso 的Java RMI或 Elliotte Harold 的Java Network Programming。
RMI 并没有太大变化。我认为1.3时代的书会很好。
谢谢大家的回答我认为人们所说的关于 RMI 没有太大变化的说法是正确的,但是教程仍然可以更好一些,它们掩盖了一些重要的观点。
最后,我发现迄今为止最好的一本书,它涵盖了 RMI 的一些非常好的部分,例如激活是Java 网络编程和分布式计算。
我确实看过O'reilly Java RMI的另一本书,在我看来,它对于任何比最小的 RMI 项目更大的东西都不是很好。
如果你打算大量使用 RMI,我建议你看看Spring Remoting。它对抽象远程协议有很大帮助,可以帮助您稍后根据需要切换远程实现(例如切换到 Hessian 或 SOAP)。
如果您使用 RMI 或任何其他远程对象协议,要记住的一件事是,您可以通过调用远程对象上的方法来产生大量流量。在您的代码中,这些对象是远程的可能并不明显。它可能会产生性能问题。
如果可以的话,我建议你有一个或多或少面向服务的架构,你可以调用远程服务来获取数据对象,但不要对这些对象有太多的行为......
您是否尝试过 Sun't RMI 教程?Sun 的教程都非常好,它们通常是我学习 Java 的第一个起点。
我们在学校使用的一本有很好示例代码的书是J2EE Developer's Handbook。请记住,这是一本大约 1500 页的巨大参考书,其中只有一章(约 50 页)关于 RMI。
O'Reilly RMI 的书非常好。去吧。
除了已经提到的那些,文章Understanding Java RMI Internals是相当不错的恕我直言,对内部进行了一些介绍。
这是使用 Redisson 框架进行远程方法调用的另一个很好的示例:
假设YourServiceImpl
包含您需要远程调用的方法并实现YourService
接口。
YourServiceImpl 应该通过 RemoteService 对象在 Redisson 中注册:
YourService yourService = new YourServiceImpl();
RRemoteService remoteService = redisson.getRemoteService();
remoteService.register(YourService.class, yourService);
要远程调用方法,只需要服务接口:
RRemoteService remoteService = redisson.getRemoteService();
YourService service = remoteService.get(YourService.class);
MyObject result = service.myMethod(someParam1, someParam2);
它还支持异步调用。
// async interface for YourService
@RRemoteAsync(YourService.class)
public interface YourServiceAsync {
RFuture<Long> someMethod1(Long param1, String param2);
RFuture<Void> someMethod2(MyObject param);
}
RRemoteService remoteService = redisson.getRemoteService();
YourServiceAsync asyncService = remoteService.get(YourServiceAsync.class);
RFuture<Long> res = asyncService.someMethod1(12L, "param");
res.thenApply(r -> {
...
});
更多细节在这里