39

在用 Java 设计分布式应用程序时,似乎有一些技术可以解决同样的问题。我已经简要阅读过Java Remote Method InvocationJava Message Service,但很难真正看出其中的区别。Java RMI 似乎比 JMS 耦合更紧密,因为 JMS 使用异步通信,但除此之外我看不出有什么大的不同。

  • 它们之间有什么区别?
  • 其中一个比另一个新吗?
  • 哪一种在企业中更常见/流行?
  • 他们彼此有什么优势?
  • 什么时候优先于另一个?
  • 它们在实施难度上是否有很大差异?

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

4

2 回答 2

46

您已经了解方法调用。如果您要调用该方法的对象在另一台计算机上怎么办?您使用 RMI 将呼叫从一台计算机(客户端)发送到另一台计算机(服务器)。客户端将等待(或“阻塞”)直到结果从服务器返回。这称为同步操作。

JMS 则不同:它允许一台计算机向另一台计算机发送消息——比如电子邮件。第一个不必等待响应:它可以继续做它想做的任何工作。甚至可能没有回应。两个计算机系统不一定完全同步工作,所以这称为异步

另一种思考差异的方式:RMI就像打电话,而JMS就像发送短信。

RMI 比 JMS 稍早,但这并不重要。这两个概念比java要古老得多。

复杂度没有太大区别。我认为您应该尝试为每个人做一个教程。RMIJMS

如果您从头开始一个项目,并且不确定要使用哪一个,那么同步/异步问题可能是最佳决策因素。如果您正在使用现有系统,最好不要引入太多新技术。因此,如果他们已经在使用一个,那么我建议最好还是坚持使用那个。

于 2010-04-05T01:05:43.030 回答
33

你不能真正比较两者,它的苹果和橘子。

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

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

RMI 不处理有保证的交付或异步响应,JMS 可能,这取决于提供者。

JMS 在可用性方面允许松散耦合。“Web 服务”在协议和数据的意义上允许松散耦合,但并没有详细说明可靠消息传递的方式,尽管有些实现确实包括这一点(Windows Communication Foundation)而有些则没有。

已编辑:根据评论进行了修订。当我在 2010 年写这个答案时,我的经验实际上是只有一个 JMS 提供者,我实际上并不知道没有默认的 JMS 提供者。

于 2010-04-05T00:55:47.643 回答