-->

当消息传递(例如,JMS)用于多线程的方法吗?(When is messaging (e.g. JM

2019-08-21 07:57发布

我在其中并发是通过把几个工作单元上,一个消息驱动bean(MDB)的多个实例收听到消息队列实现的数据处理应用程序。 除了以这种方式实现并发性,我们并没有任何特别原因需要使用消息传递基础结构和MDB。

这使我想到,为什么同已经不能使用多线程来实现的。

所以我的问题是,在什么情况下可以异步消息传递(如JMS)被用作替代mutithreading达到并发的一种手段? 什么是使用了另外一个方法的一些优势/劣势。

Answer 1:

它不能被用来作为一种替代,以多线程,这是在实施多线程的方式。 有三种基本类型这里的解决方案:

  1. 您负责队列的两端;
  2. 你是负责发送数据; 要么
  3. 你是负责接收数据。

接收的数据在这里踢球,因为真的没有这样做,如果没有某种形式的多线程/多的,否则你将只处理一次一个请求的方式。 没有多线程发送的数据更可行的,但有你才真正推动这些信息处理与外部系统的责任。 因此,这不是多线程的替代品。

在你的情况与消息驱动Bean,容器创建和管理线程你所以它不是多线程的替代,你只是用别人的实现。



Answer 2:

还有,我不认为已经提到了两个额外的奖励: 交易耐用性

虽然它不是必需的,往往不是默认配置,JMS提供者可以被配置为持续的信息,同时参加在很少或根本没有代码变化的XA事务。



Answer 3:

在EJB容器,实际上,没有别的选择,因为你不允许在EJB容器中创建自己的线程。 JMS做所有你的工作,在通过队列处理器运行它的成本。 你也可以创建一个Java Connector,它具有与容器更亲密的关系(因此,可以有线程),但它是一个大量的工作。

如果使用JMS队列的开销是不是有一个性能的影响,那么这是最简单的解决方案。



Answer 4:

性能明智的多线程应该比任何消息更快,因为你的消息添加一个额外的网络层。
应用明智的消息可以帮助您避免锁定和数据共享的问题,因为没有共同的目标。
从比例的角度消息是,你可以在多个服务器上配置只是多个节点好多了通过配置信息服务,而不是不断变化的应用。



Answer 5:

消息可以大大减少在多线程应用程序的错误数目,因为它减少了数据竞争风险。 它还简化了在不改变应用程序的其余部分增加新主题。

虽然我认为JMS略微这里滥用。 java.util.concurrent中的线程安全的队列和库,例如jetlang可以提供更好的性能。



Answer 6:

使用多线程可以通过共享CPU核心实现并发。 但是如果你使用JMS,而不是可以平衡负载,并可以委派任务给其他系统。 例如,假设您的应用需求对某些任务的完成发送电子邮件。 而要同时发送电子邮件。 要么你可以拉一个线程和处理它是异步的。 或者你也可以委托邮件的这个任务使用JMS发送到其他系统。 无接收器线程可以在JMS配置。 同时多个节点可以听相同的JMS队列,其平衡负载。 您还可以使用进一步的应用,如持久性队列,事务管理队列为每个应用程序。

简单地说,JMS可以是多线程更好的选择取决于应用架构



文章来源: When is messaging (e.g. JMS) an alternative for multithreading?