真实世界使用JMS /消息队列?

nos*_*nos 174 java jms message-queue

我只是在阅读关于JMS和Apache ActiveMQ的abit.并且想知道现实世界中有人使用JMS或类似的消息队列技术吗?

Jon*_*Jon 182

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

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

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

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

  • 如果任何数量的应用程序可能正在使用队列中的消息,队列如何知道何时删除旧消息? (2认同)

duf*_*ymo 90

始终使用它们异步处理长时间运行的操作.Web用户不希望等待超过5秒的时间来处理请求.如果您的运行时间超过了一个,那么一种设计是将请求提交到队列并立即发回一个URL,用户可以检查该URL以查看作业何时完成.

发布/订阅是另一种将发送者与许多接收者分离的好方法.它是一种灵活的架构,因为订户可以根据需要来去.

  • 在阅读完答案之后,我将把JMS添加到我的队列中"我将在今年学到什么":) (39认同)
  • 它们并不完全相同.使用异步方法调用无法保证交付; 没有可以一次发送给几个听众的主题概念. (3认同)

小智 74

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

  • 用于客户服务的Web聊天通信.

  • 调试后端的日志记录.所有应用服务器都在各个级别广播调试消息.然后可以启动JMS客户端以监视调试消息.当然我可以使用像syslog这样的东西,但这给了我各种方法来根据上下文信息过滤输出(eq由app server name,api call,log level,userid,message type等...).我也把输出着色了.

  • 调试记录到文件.与上面相同,仅使用过滤器拉出特定部分,并记录到文件以进行常规日志记录.

  • 警报.再次,与上述日志记录类似的设置,观察特定错误,并通过各种方式警告人们(电子邮件,短信,IM,低吼弹出......)

  • 动态配置和控制软件集群.每个应用服务器都会广播一个"configure me"消息,然后是一个配置守护进程,它将使用包含各种配置信息的消息进行响应.稍后,如果所有应用服务器都需要立即更改其配置,则可以从配置守护程序完成.

  • 通常 - 延迟活动的排队交易,如结算,订单处理,配置,电子邮件生成......

在任何想要保证异步传递消息的地方都很棒.

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

pug*_*arx 19

分布式(a)同步计算.
一个真实世界的例子可以是一个应用程序范围的通知框架,它在应用程序使用过程中的各个点向利益相关者发送邮件.因此,应用程序将Producer通过创建一个Message对象,将其放在特定的对象上Queue,然后继续前进.
会有一组Consumers会订阅相关Queue问题,并会小心处理Message发送的内容.请注意,在此事务过程中,Producers与Message处理给定的逻辑分离.
消息传递框架(ActiveMQ等)充当Message通过提供MessageBrokers 来促进此类事务的主干.


Ric*_*dOD 10

我用它来发送不同基金管理系统之间的日内交易.如果您想了解更多有关精彩技术消息传递的信息,我可以全面推荐" 企业集成模式 " 一书.有一些JMS示例用于请求/回复和发布/订阅.

消息传递是一种很好的集成工具.


Kev*_*ams 8

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

例如,假设你有一个昂贵且非常重要的逻辑,比如"买东西",购买东西的一个重要部分就是"通知东西商店".我们使通知调用异步,以便通知调用中涉及的任何逻辑/处理都不会阻止或与使用购买业务逻辑的资源竞争.最终结果,购买完成,用户满意,我们得到我们的钱,因为队列是有保证的交付,商店一打开就会得到通知,或者一旦队列中有新项目就会立即得到通知.

  • 但由于请求是异步的,因为网络问题,您的消息可能不会被发送.那这个呢?当你想买东西时,必须发送你的硝化物.不是吗? (2认同)

qwe*_*rty 8

我把它用于我的学术项目,这是一个类似亚马逊的在线零售网站.JMS用于处理以下功能:

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

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


par*_*oir 6

我见过JMS用于不同的商业和学术项目.只要您想要一个完全分离的分布式系统,JMS就可以很容易地进入您的画面.一般来说,当您需要从一个节点发送请求时,网络中的某个人在没有/向发送者提供有关接收者的任何信息的情况下处理它.

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


blu*_*ene 5

我们已经使用消息来生成在线报价


Rob*_*ies 5

Apache Camel与ActiveMQ结合使用是实现企业集成模式的好方法