现实世界中使用JMS /消息队列?[关闭]


182

我只是对JMS和Apache ActiveMQ有所了解。并想知道这里的人们将JMS或类似的消息队列技术用于什么吗?

Answers:


191

JMS(ActiveMQ是JMS代理实现)可以用作允许异步请求处理的机制。您可能希望这样做,因为请求需要很长时间才能完成,或者因为实际的请求可能涉及多个方面。使用它的另一个原因是允许多个客户端(可能以不同的语言编写)通过JMS访问信息。ActiveMQ是一个很好的示例,因为您可以使用STOMP协议来允许从C#/ Java / Ruby客户端进行访问。

一个真实的示例是用于为特定客户下订单的Web应用程序的示例。作为下订单(并将其存储在数据库中)的一部分,您可能希望执行许多其他任务:

  • 将订单存储在某种第三方后端系统(例如SAP)中
  • 发送电子邮件给客户,通知他们他们的订单已下达

为此,您的应用程序代码会将消息发布到包含订单ID的JMS队列中。您的应用程序中侦听队列的一部分可以通过获取orderId来响应该事件,在数据库中查找订单,然后将该订单提交给另一第三方系统。应用程序的另一部分可能负责获取orderId并向客户发送确认电子邮件。


嗨,@ jon,您看到此文档标签了吗? stackoverflow.com/documentation/jms/commit他们只需要一个提交者支持即可启用该主题,我想您可能是一个:),它使他们能够为我们提供有关JMS的
出色

据我了解,@ Jon jms本身就是企业集成模式的实现?
valik'Mar

不,M子或骆驼是……
Jon

1
如果任何数量的应用程序正在使用队列中的消息,那么队列如何知道何时删除旧消息?
罗勒·布尔克

95

始终使用它们来异步处理长时间运行的操作。网络用户不希望等待超过5秒来处理请求。如果运行的时间更长,则一种设计是将请求提交到队列,然后立即发送回URL,供用户检查以查看作业何时完成。

发布/订阅是将发送者与许多接收者解耦的另一种好方法。这是一种灵活的体系结构,因为订户可以根据需要来来去去。


41
阅读您的答案后,我将把JMS添加到我的队列“今年我将要学习的内容” :)
Roman

在当今,我们可以使用异步方法调用来代替JMS规范。欲了解更多信息,请参阅:docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
地质

3
它们并不完全相同。异步方法调用不能保证交付;没有可以同时发送给多个侦听器的主题的概念。
duffymo '18

75

我对JMS有很多惊人的用途:

  • 网络聊天交流,以提供客户服务。

  • 在后端调试日志。所有应用服务器都在各个级别广播调试消息。然后可以启动JMS客户端以监视调试消息。当然,我可以使用syslog之类的东西,但这给了我各种各样的方式来根据上下文信息(例如,按应用服务器名称,API调用,日志级别,用户ID,消息类型等对信息进行过滤)。我还为输出着色。

  • 调试日志记录到文件。与上述相同,仅使用过滤器提取特定的片段,并将其记录到文件中以进行常规记录。

  • 警报。同样,与上面的日志记录类似的设置,监视特定错误并通过各种方式(电子邮件,短信,IM,低吼弹出窗口等)提醒人们。

  • 动态配置和控制软件集群。每个应用程序服务器将广播“配置我”消息,然后广播配置守护程序,该守护程序将以包含各种配置信息的消息进行响应。以后,如果所有应用服务器都需要立即更改其配置,则可以通过config守护程序来完成。

  • 和通常的-排队交易延迟活动,例如账单,订单处理,供应,电子邮件生成...

您希望保证异步传递消息的任何地方都非常好。


5
使用JMS进行调试日志记录对我来说似乎不合适。队列和消息传递成本很高,并且日志记录(通常用于调试的日志很多)必须尽可能快。
Marco Altieri

19

分布式(a)同步计算。
一个真实的示例可能是整个应用程序范围的通知框架,该框架在应用程序使用过程中的各个时间点将邮件发送给利益相关者。因此,应用程序将Producer通过创建Message对象,将其放在特定对象上Queue并向前移动来充当。
将有一组Consumers会订阅相关的Queue,并会小心处理Message发送过来的内容。请注意,在此交易过程中,Producers与如何Message处理给定逻辑分离。
消息传递框架(ActiveMQ等)充当主干,Message通过提供来促进此类交易MessageBroker


我想要异步处理,因为RestService Api是同步的。如何使用ActiveMq和Jms进行操作。请提供帮助。stackoverflow.com/questions/19706788/…。感谢您的帮助和时间
-Kumar

10

我用它来发送不同基金管理系统之间的日内交易。如果您想详细了解什么是出色的技术消息传递,我可以为您推荐“ Enterprise Integration Patterns ” 一书。有一些用于请求/回复和发布/订阅之类的JMS示例。

消息传递是集成的绝佳工具。


8

我们使用它来启动异步处理,我们不想中断或与现有事务冲突。

例如,假设您有一个昂贵且非常重要的逻辑,例如“购买东西”,那么购买东西的重要部分就是“通知东西商店”。我们使通知调用异步进行,以便通知调用中涉及的任何逻辑/处理都不会阻塞或与购买业务逻辑争用资源。最终结果,购买完成,用户满意,我们得到了收益,并且由于保证了队列的交付,因此商店一旦开业或队列中有新商品,便会得到通知。


1
请帮忙。stackoverflow.com/questions/19706788/…。感谢您的帮助和时间。
库玛(Kumar)

2
但是由于请求是异步的,由于网络问题,您的消息可能不会被发送。那这个呢?当您要购买东西时,必须发送您的通知书。是不是
grep

8

我将其用于我的学术项目,该项目是类似于Amazon的在线零售网站。JMS用于处理以下功能:

  1. 当货物从一个地点移动到另一个地点时,更新客户下达的订单的位置。这是通过不断向JMS Queue发送消息来完成的。
  2. 警报任何异常事件,例如延迟装运,然后向客户发送电子邮件。
  3. 如果到达目的地,则发送一个传递事件。

我们还有多个已实现的远程客户端连接到主服务器。如果连接可用,他们将使用访问主数据库,或者如果不使用自己的数据库。为了处理数据一致性,我们实现了2PC机制。为此,我们使用JMS在这些系统之间交换消息,即一个充当协调者的人将通过在队列上发送消息来启动该过程,而另一个将通过在队列中再次发送消息来做出相应的响应。正如其他人已经提到的,这类似于发布/订阅模型。


6

我已经看到JMS用于不同的商业和学术项目。每当您想要完全分离的分布式系统时,JMS都可以轻松地出现在您的图片中。一般而言,当您需要从一个节点发送请求时,网络中的某人可以处理该请求,而无需/不向发送者提供有关接收者的任何信息。

就我而言,我在论文中使用了JMS来开发面向消息的中间件(MOM),在该中间件中,特定类型的面向对象的对象作为您的请求在一侧生成,并在另一侧作为您的响应进行编译和执行。 。




4

我们正在使用JMS通过不可靠的网络与大量远程站点中的系统进行通信。松散的耦合与可靠的消息传递相结合,形成了稳定的系统格局:每条消息将在技术上可行的情况下尽快发送,网络中更大的问题将不会对整个系统格局产生影响...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.