Java Message Service (JMS) 是用来做什么的?

34

我目前正在评估 JMS,但我不知道它有哪些用途。

目前,我的想法是:当销售订单离开仓库时,我想创建一个销售发票PDF并打印它。因此,在交付事务期间,我可以发送一个事务性打印请求,该请求在销售订单事务成功完成后立即开始。

现在我发现大多数 JMS 产品都是独立的服务器。

  • 为什么需要一个独立的服务器来处理消息,而不是使用 Quartz 调度程序进行简单的进程内处理?
  • 它如何与我的应用程序互动?
  • 它不会太慢了吗?
  • 您已经成功实现了哪些用例?

3
请参见https://dev59.com/7XNA5IYBdhLWcg3wQ7Uw。 - Mark
如果你没有用它的地方,那么看起来你的评估已经完成了。 ;) - TMN
1
要了解与消息传递相关的概念以及JMS可以帮助哪些模式,您只需要访问:http://www.eaipatterns.com/。 - SteveD
8个回答

48

JMS 是一个非常有用的系统,但并非适用于所有用途。

它本质上是一个高级框架,用于在节点之间发送消息,并提供了发现、稳健性等选项。

一个有用的用例是当您想让客户端和服务器彼此通信,但客户端实际上没有服务器的地址时(例如,您可能有多个服务器)。客户端只需要知道代理和队列/主题名称,而服务器也可以连接。

JMS 还增加了鲁棒性。例如,您可以配置它,以便如果服务器在客户端发送消息或反过来时死机,仍然可以从客户端发送消息或从服务器轮询消息。如果您曾尝试使用套接字直接实现这一点 - 那简直是一场噩梦。

您描述的情景听起来像是一个经典的 J2EE 问题,为什么不使用 J2EE 框架?JMS 通常在 J2EE 中用于通信,但您可以获得所有其他好处。


1
+1:我可能误解了,但我认为JMS是J2EE的一部分,旨在使J2EE组件进行通信...这不是事实吗? - LB40
3
不必使用J2EE组件,任何Java组件都可以使用JMS。 - Don Branson
不,您可以独立于J2EE beans使用JMS。我经常这样做,而且它非常容易。但是,您的问题似乎可以从EJB中受益,此时JMS位于幕后。 - Uri
1
大多数应用程序使用消息驱动的Bean来消费消息(以获得集群和负载平衡的好处),但是一个简单的Java类也可以作为消费者。顺便说一下,自2005年以来,J2EE已经不存在了,现在已经超过5年了,改称为Java EE :) - Pascal Thivent
我认为应用服务器使用JMS来处理MDB。关于J2EE的好点是,我已经有超过5年没有碰过那些东西了 :) - Uri
@Uri:对我来说也是一样的,对于Java EE纯粹主义者感到抱歉... :-) - LB40

18

Java消息服务(JMS)是做什么的?

JMS是一种消息传递标准,允许Java EE应用程序以松散耦合、可靠和异步的方式创建、发送、接收和消费消息。建议阅读Java消息服务API概述了解更多细节。

为什么需要一个独立的服务器来处理消息,而不是使用Quartz调度程序进行简单的inproc处理等?

当发票系统是远程系统时,当您不想等待答案时,当希望与之通信的远程系统停机时,或者当网络不总是可用时,该怎么办?在这种情况下,就需要使用JMS。JMS允许发送保证交付的消息,并以事务方式使用(发送或消费消息可以成为全局事务的一部分)。

JMS如何与我的应用程序交互?

JMS支持两种通信模式:点对点和发布/订阅(如果这回答了问题)。

它不是太慢了吗?

我使用的MOM都非常快。

您已经成功实现过哪些用例?

用于如预订应用程序、银行后台(处理市场数据)等系统,或者更简单地发送电子邮件。

另请参阅


5
为什么需要一个独立的消息处理服务器,而不是像使用Quartz调度程序那样进行简单的内部处理呢?JMS的优势在于您可以为同一队列拥有多个生产者和多个消费者,并且JMS代理可以管理负载。如果您只有多个生产者但只有一个消费者,则还可以使用其他方法,例如Quartz调度程序和数据库表。但是,一旦您有多个消费者,锁定方案就变得非常难以设计;最好选择已经获得批准的消息传递解决方案。请参阅我在以下链接中的其他答案,了解更多详细信息:Why choosing JMS for asynchronous solution ?Producer/consumer system using database。其他观点太模糊了,无法回答。

3

1

JMS是一种面向消息的中间件

  • 为什么需要独立的服务器进行消息处理,而不是使用Quartz调度程序进行简单的inproc处理?

这取决于您可能拥有的其他组件。我猜。但我不知道Quartz的任何信息。

  • 它如何与我的应用程序交互?

您将消息发送到代理程序。

  • 它不是太慢了吗?

与什么进行比较?

  • 您已经成功实现了哪些用例?

我已经使用JMS实现了一个SIP应用程序服务器,用于在各个组件之间进行通信。


1
消息传递通常用于连接不同的系统并异步发送请求/命令。一个常见的例子是银行客户端应用程序请求交易批准。服务器位于另一个银行的系统中。两个系统都连接在企业服务总线上。请求进入消息总线,该总线立即确认接收到消息。客户端可以继续处理。每当服务器系统变得可用时,总线就会将消息转发给它。当然,还需要第二条路径,以便服务器通知客户端事务成功执行或失败。这也可以使用JMS实现。
请注意,两个系统不需要都实现JMS。一个可以使用JMS,另一个可以使用MSMQ。总线将负责互连。

1

来自Javadoc:

Java消息服务(JMS)API为Java程序提供了一种常见的方式来创建、发送、接收和读取企业消息系统的消息。

换句话说,与其他答案相反,JMS不过是一个API,通过由供应商实现的“JMS提供程序”封装对第三方消息代理的访问。这些消息代理,例如IBM MQ和其他几十个代理,具有可靠性、异步等特性,这些特性已在其他答案中提到。JMS本身并没有提供任何这些功能。它就像JDBC对SQL数据库或JNDI对LDAP服务器(以及其他一些东西)一样,是消息代理的一种封装。


@downvoter 你可能不喜欢,但事实就是这样。 - user207421
好的,那就算我投赞成票了。但实际上这个答案听起来有点学究气。 - Daniel
@Daniel 我不知道那是什么意思,除非它只是意味着“正确”,或者是一种赞美。 - user207421

0

我已经找到了一个非常好的JMS解释和示例。

这是一个简单的聊天应用程序,其中使用JMS队列在用户之间通信消息,并且如果接收者离线,则消息保留在队列中。

在此示例实现中,他们使用:

  • XSD生成域类。
  • Eclipse EE作为IDE。
  • JBoss作为Web/应用服务器。
  • HTML/JavaScript/JQuery用于UI。
  • Servlet作为控制器。
  • MySQL作为DB。

JBoss配置队列的步骤说明得很好 它可以在http://coder2design.com/messaging-service/上找到。

甚至可下载的代码也在那里提供。


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