Enn*_*oji 14
简化比较(不是特别针对JMS,更像是与MQ的比较)...
自动重试
如果您是客户端对服务器执行RMI并且由于某种原因RMI失败,则必须自己重试.如果您使用JMS并且您是客户端,则只需发送JMS消息.当无法访问服务器时,将存储您的消息,然后在服务器再次启动时传递.
持久队列
由于您使用的是LinkedBlockingQueue,因此您可以在内存中拥有有界队列或无界队列.一旦队列已满,前者将开始捕获线程,并最终在高负载下失败.后者最终会抛出OutOfMemoryError.如果你使用JMS,它可以自动开始"持久化"消息到"持久存储".通常,"持久存储"是DB,它通常比内存中队列容量大得多.当然,当服务器发生故障时,内存中队列的内容会丢失,而在JMS中,您可以选择在此类事件中幸存的持久消息/持久消息.这也允许您进行群集,这对企业程序也非常重要......
抽象
你将使用标准化的API(好吧,你也有RMI中的协议,但如果你想要的是传递消息,MQ提供比RMI +内存中队列更多的高级抽象).这意味着,您可以使用JMS的未来实现.也许某些东西不需要DB来提供持久性和持久性,比今天的实现更具可扩展性.或者也许您可以将相同的消息发送到完全不同的服务,因为standerization.基本上,较高的抽象可以为您提供灵活性,RMI +内存中的队列不会.
前段时间,我曾与一家大公司合作,希望利用他们的内部框架来整合我们的东西.那时我们没有使用MQ.我们要求他们使用我们自己的基于RMI的异步协议.相信我,我们非常非常后悔这个决定......
其他答案涵盖了JMS的许多方面,但我觉得非常重要的一个需要更多的重点,即JMS 以事务方式支持多个并发消费者.这对我来说是一个杀手锏.
当我们谈到JMS 可伸缩性时,我们会谈到这个:应用程序的能力.服务器添加/删除使用者/生产者来管理负载.
JMS的其他优点是服务质量和管理,例如重新传递尝试,死信息队列,监视等.
如果你真的不需要,一个稍微简单的解决方案可能会起作用.您还可以看到我的另一个答案,其中我提到了类似的问题:为什么选择JMS进行异步解决方案?