我目前正在评估 JMS,但我不知道它有哪些用途。
目前,我的想法是:当销售订单离开仓库时,我想创建一个销售发票PDF并打印它。因此,在交付事务期间,我可以发送一个事务性打印请求,该请求在销售订单事务成功完成后立即开始。
现在我发现大多数 JMS 产品都是独立的服务器。
- 为什么需要一个独立的服务器来处理消息,而不是使用 Quartz 调度程序进行简单的进程内处理?
- 它如何与我的应用程序互动?
- 它不会太慢了吗?
- 您已经成功实现了哪些用例?
我目前正在评估 JMS,但我不知道它有哪些用途。
目前,我的想法是:当销售订单离开仓库时,我想创建一个销售发票PDF并打印它。因此,在交付事务期间,我可以发送一个事务性打印请求,该请求在销售订单事务成功完成后立即开始。
现在我发现大多数 JMS 产品都是独立的服务器。
JMS 是一个非常有用的系统,但并非适用于所有用途。
它本质上是一个高级框架,用于在节点之间发送消息,并提供了发现、稳健性等选项。
一个有用的用例是当您想让客户端和服务器彼此通信,但客户端实际上没有服务器的地址时(例如,您可能有多个服务器)。客户端只需要知道代理和队列/主题名称,而服务器也可以连接。
JMS 还增加了鲁棒性。例如,您可以配置它,以便如果服务器在客户端发送消息或反过来时死机,仍然可以从客户端发送消息或从服务器轮询消息。如果您曾尝试使用套接字直接实现这一点 - 那简直是一场噩梦。
您描述的情景听起来像是一个经典的 J2EE 问题,为什么不使用 J2EE 框架?JMS 通常在 J2EE 中用于通信,但您可以获得所有其他好处。
Java消息服务(JMS)是做什么的?
JMS是一种消息传递标准,允许Java EE应用程序以松散耦合、可靠和异步的方式创建、发送、接收和消费消息。建议阅读Java消息服务API概述了解更多细节。
为什么需要一个独立的服务器来处理消息,而不是使用Quartz调度程序进行简单的inproc处理等?
当发票系统是远程系统时,当您不想等待答案时,当希望与之通信的远程系统停机时,或者当网络不总是可用时,该怎么办?在这种情况下,就需要使用JMS。JMS允许发送保证交付的消息,并以事务方式使用(发送或消费消息可以成为全局事务的一部分)。
JMS如何与我的应用程序交互?
JMS支持两种通信模式:点对点和发布/订阅(如果这回答了问题)。
它不是太慢了吗?
我使用的MOM都非常快。
您已经成功实现过哪些用例?
用于如预订应用程序、银行后台(处理市场数据)等系统,或者更简单地发送电子邮件。
我已经在许多项目中使用它。它可以帮助扩展性、服务解耦和高可用性。以下是我几年前在一个项目中如何使用它的描述:
http://coders-log.blogspot.com/2008/12/favorite-projects-series-installment-2.html
这个描述解释了JMS为这个特定项目带来的好处,但其他项目会出于各种原因使用消息系统。
JMS是一种面向消息的中间件。
- 为什么需要独立的服务器进行消息处理,而不是使用Quartz调度程序进行简单的inproc处理?
这取决于您可能拥有的其他组件。我猜。但我不知道Quartz的任何信息。
- 它如何与我的应用程序交互?
您将消息发送到代理程序。
- 它不是太慢了吗?
与什么进行比较?
- 您已经成功实现了哪些用例?
我已经使用JMS实现了一个SIP应用程序服务器,用于在各个组件之间进行通信。
来自Javadoc:
Java消息服务(JMS)API为Java程序提供了一种常见的方式来创建、发送、接收和读取企业消息系统的消息。
换句话说,与其他答案相反,JMS不过是一个API,通过由供应商实现的“JMS提供程序”封装对第三方消息代理的访问。这些消息代理,例如IBM MQ和其他几十个代理,具有可靠性、异步等特性,这些特性已在其他答案中提到。JMS本身并没有提供任何这些功能。它就像JDBC对SQL数据库或JNDI对LDAP服务器(以及其他一些东西)一样,是消息代理的一种封装。
我已经找到了一个非常好的JMS解释和示例。
这是一个简单的聊天应用程序,其中使用JMS队列在用户之间通信消息,并且如果接收者离线,则消息保留在队列中。
在此示例实现中,他们使用:
JBoss配置队列的步骤说明得很好 它可以在http://coder2design.com/messaging-service/上找到。
甚至可下载的代码也在那里提供。