大家好,我目前正在开展一个涉及广泛使用Java RMI的项目,我想知道是否有人知道有关它的任何好资源。
我目前找到的材料问题是它通常已经过时(如Java 1.3)和/或半完成。我甚至乐意买一本书,但在亚马逊上看,所有的书都像7岁。
因此,如果有人知道任何好的资源,书籍或良好的示例实现,我将非常有兴趣了解它们。在此先感谢您的帮助。
答案 0 :(得分:9)
RMI Hello World看起来很不错。当然它仍然是一个简单的例子,因此你可能已经熟悉RMI,因此tips on RMI performance/scalability可能会有用。
答案 1 :(得分:5)
多年来Java.RMI的变化很小,因此仍然可以引用大多数旧文档。请注意,如果您使用的是Java 5.0版本,则需要编译RMI存根。 大多数人已经离开了RMI并且已经为分布式系统接受了River(以前称为Jini)。
如果您仍在考虑继续使用RMI,我建议您阅读the Oracle documentation或在their forums上发布您的问题。
至于威廉格罗索的书籍 Java RMI 或Elliotte Harold的 Java网络编程。
答案 2 :(得分:4)
RMI没有那么大改变。我认为1.3时代的书籍会很好。
答案 3 :(得分:3)
谢谢大家的回答我认为人们所说的关于RMI没有太多变化的说法是正确的,但是教程仍然可以更好地掩盖一些重点。
到目前为止,我发现的最好的书,其中包括一些非常好的RMI,如激活是Java Network Programming and Distributed Computing。
我确实看过另一本O'reilly Java RMI书,而且在我看来,它对于任何比最小的RMI项目都要大的东西都不是很好。
答案 4 :(得分:3)
如果您要大量使用RMI,我建议您查看Spring Remoting。它有助于抽象远程协议,帮助您在以后需要时切换远程实现(例如切换到Hessian或SOAP)。
如果使用RMI或任何其他远程对象协议,请记住一件事是,您可以通过调用远程对象上的方法来生成大量流量。在您的代码中,这些对象可能是远程的,这可能并不明显。它可能会产生性能问题。
如果可以的话,我建议您建立一个或多或少面向服务的架构,在这里您可以调用远程服务来获取数据对象,但不要对这些对象有太多行为......
答案 5 :(得分:2)
你试过Sun't RMI tutorial吗? Sun教程都非常好,它们通常是我开始学习Java的第一个地方。
我们在学校使用的具有良好示例代码的书籍是J2EE Developer's Handbook。请记住,这是一本大约1500页的大型参考书,在RMI上只有一章(约50页)。
答案 6 :(得分:1)
O'Reilly RMI的书非常好。去吧。
答案 7 :(得分:1)
多宿主RMI(具有多个IP的主机)绝对无价article以非常容易理解的方式解释RMI,并讨论在具有多个IP地址的计算机上托管注册表的问题以及私有IP的方式也可以处理。保存了我的培根。
答案 8 :(得分:0)
除了已经提到的那些,文章Understanding Java RMI Internals相当不错恕我直言,在内部进行了一些。
答案 9 :(得分:0)
这是使用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 -> {
...
});
更多详情here