Java RMI和JMS有什么区别?

39
在Java中设计分布式应用程序时,似乎有几种技术可以解决同类问题。我简要了解了Java远程方法调用Java消息服务,但很难真正看出区别。Java RMI似乎比JMS更紧密耦合,因为JMS使用异步通信,但除此之外我没有看到任何重大差异。
  • 它们之间有什么区别?
  • 它们中的一种比另一种新吗?
  • 哪一个在企业中更常见/流行?
  • 它们彼此相比具有什么优势?
  • 在什么情况下首选其中之一?
  • 它们在实现上难度是否有很大不同?

我还认为Web服务CORBA解决了同样的问题。


这些听起来像是面试问题,因为你把两个听起来相似但实际上应该被认为非常不同的术语混在了一起,对于理解它们的人来说。 - Peter Lawrey
它们不“解决相同类型的问题”。 - user207421
2个回答

46
您已经了解方法调用。如果您想要调用方法的对象位于另一台计算机上怎么办?您可以使用RMI将调用从一个计算机(客户端)发送到另一个计算机(服务器)。客户端将等待(或"阻塞"),直到结果从服务器返回。这称为同步操作。
JMS则不同:它允许一台计算机向另一台计算机发送消息,就像发送电子邮件一样。第一台计算机不必等待响应:它可以继续执行任何工作。甚至可能没有响应。这两个计算机系统不一定完全同步,因此称之为异步
对于区别的另一种思考方式是:RMI就像打电话,而JMS就像发短信。
RMI比JMS稍微早一些,但这并不是非常相关的。这两个概念比Java还要古老得多。
在复杂度方面没有太大差异。我认为您应该尝试分别进行每个教程。 RMIJMS 如果您正在从头开始启动项目,并且不确定要使用哪种方法,则可能同步/异步问题是最好的决策因素。如果您正在使用现有系统,则最好不要引入过多的新技术。因此,如果他们已经在使用一种方法,则建议最好坚持使用该方法。

33

这两者不可真正比较,就像是比较苹果和橙子。

RMI是一种远程过程调用(RPC)形式。它是一个轻量级的、Java 特定的API,需要在通信时调用方和接收方都可用。

JMS是一种可靠的消息传递API。存在各种消息系统的JMS提供程序。如果提供商实现了,即使其中一方不可用,也可以传递消息。我熟悉的有TIBCO和IBM MQ两个。

RMI不处理保证交付或异步响应,而JMS可能会,这取决于提供程序。

JMS允许松耦合,就可用性而言。“Web服务”允许松耦合,就协议和数据而言,但在可靠消息方面没有太多具体规定,尽管某些实现包含此功能(Windows Communication Foundation),而某些则不包括。

编辑:根据评论进行修订。当我在2010年编写此答案时,我的实际经验只涉及一种JMS提供程序,我并不知道没有默认的JMS提供程序。


JMS并不是可靠的消息子系统,也不是MQSeries的替代品。它是一个可以与MQSeries和许多其他消息系统通信的消息API。 - user207421
@mrjoltcola:你好,能否请您看一下https://dev59.com/gYnda4cB1Zd3GeqPDsbp? - Bruce_Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接