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

时间:2010-06-10 14:11:39

标签: java jms

我目前正在评估JMS,但我没有得到我可以用它的东西。

目前,我认为这将是一个Usecase:我想创建一个SalesInvoice PDF并在SalesOrder离开仓库时打印它,所以在Delivery事务期间,我可以发送一个事务性打印请求,该请求刚从SalesOrder事务完成时开始成功。

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

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

8 个答案:

答案 0 :(得分:44)

JMS是一个非常有用的系统,但不是用于各种目的。

它本质上是一个在节点之间发送消息的高级框架,具有发现选项,健壮性等。

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

JMS还增加了稳健性。例如,您可以对其进行配置,以便在客户端发送消息时服务器发生故障或相反,您仍然可以从客户端发送消息或从服务器轮询消息。如果您曾尝试使用套接字直接实现此功能 - 那将是一场噩梦。

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

答案 1 :(得分:17)

  

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

JMS是一种消息传递标准,它允许Java EE应用程序以松散耦合,可靠和异步的方式创建,发送,接收和使用消息。我建议您阅读Java Message Service API Overview了解更多详情。

  

为什么需要用于消息处理的独立服务器,例如使用Quartz调度程序进行一些简单的inproc处理?

当然,在您的情况下,Quartz是一种选择。但是如果发票系统是远程系统怎么办?如果您不想等待答案怎么办?如果远程系统在您想要与之通信时关闭怎么办?如果网络不总是可用怎么办?这就是JMS的用武之地.JMS允许发送保证交付的消息并以事务方式使用它(发送或消费消息可以是全局事务的一部分)。

  

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

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

  

是不是太慢了?

我一直在与之合作的MOM很快。

  

您已成功实施哪些用例?

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

另见

答案 2 :(得分:5)

  

为什么需要独立服务器   用于消息处理,例如一些   使用Quartz进行简单的inproc处理   调度器?

JMS的优势在于,您可以为同一队列拥有多个生产者和多个使用者,并且JMS代理可以管理负载。

如果您有多个生产者但单一消费者,您也可以使用其他方法,例如石英调度程序和数据库表。但是一旦你有多个消费者,锁定方案就变得很难设计;最好选择已经批准的消息解决方案。有关详细信息,请参阅我的其他答案:Why choosing JMS for asynchronous solution ?Producer/consumer system using database

其他几点太模糊,无法回答。

答案 3 :(得分:3)

我在很多项目中都使用过它。它可以帮助实现可伸缩性,服务分离和高可用性。以下是几年前我在项目中如何使用它的描述:

http://coders-log.blogspot.com/2008/12/favorite-projects-series-installment-2.html

该描述解释了JMS为此特定项目带来的内容,但其他项目将出于各种原因使用消息传递系统。

答案 4 :(得分:1)

JMS是message-oriented middleware

  
      
  • 为什么需要一个用于消息处理的独立服务器,例如使用Quartz调度程序进行一些简单的inproc处理?
  •   

这取决于您可能拥有的其他组件。我猜。但我对Quartz一无所知

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

您向经纪人发送消息。

  
      
  • 是不是太慢了?
  •   

比较什么?

  
      
  • 您已成功实施哪些用例?
  •   

我已经使用JMS来实现SIP应用服务器,以便在各个组件之间进行通信。

答案 5 :(得分:1)

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

请注意,这两个系统无需实现JMS。一个可以使用JMS,另一个可以使用MSMQ。公交车将负责互连。

答案 6 :(得分:1)

来自Javadoc

  

Java消息服务(JMS)API为Java程序提供了创建,发送,接收和读取企业消息系统消息的通用方法。

换句话说,与此处的所有其他答案相反,JMS只不过是一个 API, 包装访问第三个 - 派对消息代理,通过供应商实施的“JMS提供商”。那些 Message Brokers ,例如IBM MQ和许多其他人,具有其他答案中提到的可靠性,异步性等特征。 JMS本身完全不提供它们。 Message Brokers是什么JDBC是SQL数据库,JNDI是LDAP服务器(等等)。

答案 7 :(得分:0)

我通过一个例子找到了对JMS的非常好的解释。

这是一个简单的聊天应用程序,JMS队列用于在用户之间传递消息,如果接收者离线,则消息留在队列中。

在这个示例实现中,他们使用了

  • XSD生成域类。
  • Eclipse EE as IDE。
  • JBoss as web / application server。
  • HTML / JavaScript / JQuery for UI。
  • Servlet作为控制器。
  • MySQL as DB。

很好地解释了队列的JBoss配置步骤 它可在http://coder2design.com/messaging-service/

获得

即使是可下载的代码也可以在那里使用。

相关问题