我在其中并发是通过把几个工作单元上,一个消息驱动bean(MDB)的多个实例收听到消息队列实现的数据处理应用程序。 除了以这种方式实现并发性,我们并没有任何特别原因需要使用消息传递基础结构和MDB。
这使我想到,为什么同已经不能使用多线程来实现的。
所以我的问题是,在什么情况下可以异步消息传递(如JMS)被用作替代mutithreading达到并发的一种手段? 什么是使用了另外一个方法的一些优势/劣势。
我在其中并发是通过把几个工作单元上,一个消息驱动bean(MDB)的多个实例收听到消息队列实现的数据处理应用程序。 除了以这种方式实现并发性,我们并没有任何特别原因需要使用消息传递基础结构和MDB。
这使我想到,为什么同已经不能使用多线程来实现的。
所以我的问题是,在什么情况下可以异步消息传递(如JMS)被用作替代mutithreading达到并发的一种手段? 什么是使用了另外一个方法的一些优势/劣势。
它不能被用来作为一种替代,以多线程,这是在实施多线程的方式。 有三种基本类型这里的解决方案:
接收的数据在这里踢球,因为真的没有这样做,如果没有某种形式的多线程/多的,否则你将只处理一次一个请求的方式。 没有多线程发送的数据更可行的,但有你才真正推动这些信息处理与外部系统的责任。 因此,这不是多线程的替代品。
在你的情况与消息驱动Bean,容器创建和管理线程你所以它不是多线程的替代,你只是用别人的实现。
还有,我不认为已经提到了两个额外的奖励: 交易和耐用性 。
虽然它不是必需的,往往不是默认配置,JMS提供者可以被配置为持续的信息,同时参加在很少或根本没有代码变化的XA事务。
在EJB容器,实际上,没有别的选择,因为你不允许在EJB容器中创建自己的线程。 JMS做所有你的工作,在通过队列处理器运行它的成本。 你也可以创建一个Java Connector,它具有与容器更亲密的关系(因此,可以有线程),但它是一个大量的工作。
如果使用JMS队列的开销是不是有一个性能的影响,那么这是最简单的解决方案。
性能明智的多线程应该比任何消息更快,因为你的消息添加一个额外的网络层。
应用明智的消息可以帮助您避免锁定和数据共享的问题,因为没有共同的目标。
从比例的角度消息是,你可以在多个服务器上配置只是多个节点好多了通过配置信息服务,而不是不断变化的应用。
消息可以大大减少在多线程应用程序的错误数目,因为它减少了数据竞争风险。 它还简化了在不改变应用程序的其余部分增加新主题。
虽然我认为JMS略微这里滥用。 java.util.concurrent中的线程安全的队列和库,例如jetlang可以提供更好的性能。
使用多线程可以通过共享CPU核心实现并发。 但是如果你使用JMS,而不是可以平衡负载,并可以委派任务给其他系统。 例如,假设您的应用需求对某些任务的完成发送电子邮件。 而要同时发送电子邮件。 要么你可以拉一个线程和处理它是异步的。 或者你也可以委托邮件的这个任务使用JMS发送到其他系统。 无接收器线程可以在JMS配置。 同时多个节点可以听相同的JMS队列,其平衡负载。 您还可以使用进一步的应用,如持久性队列,事务管理队列为每个应用程序。
简单地说,JMS可以是多线程更好的选择取决于应用架构