消息传递(例如JMS)何时是多线程的替代方案?

Rah*_*hul 6 java multithreading jms message-passing jboss-mdb

我在一个数据处理应用程序上工作,通过在消息驱动bean(MDB)的多个实例监听的消息队列上放置几个工作单元来实现并发.除了以这种方式实现并发之外,我们没有任何具体的理由使用消息传递基础结构和MDB.

这让我想到为什么使用多线程无法实现同样的目标.

所以我的问题是,在什么情况下,异步消息传递(例如JMS)可以用作替代mutithreading作为实现并发的手段?使用一种方法比另一种方法有什么优点/缺点.

cle*_*tus 6

它不能用作多线程的替代方法,它是一种实现多线程的方法.这里有三种基本的解决方案:

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

接收数据在这里是踢球者,因为没有某种形式的多线程/多处理,实际上没有办法做到这一点,否则你一次只能处理一个请求.在没有多线程的情况下发送数据更加可行,但是你真的要把处理这些消息的责任推到外部系统.所以它不是多线程的替代品.

在您使用消息驱动Bean的情况下,容器正在为您创建和管理线程,因此它不是多线程的替代方案,您只是使用其他人的实现.


Gar*_*vis 5

我认为还有两个额外的奖金:交易耐久性.

虽然它不是必需的,并且通常不是默认配置,但可以将JMS提供程序配置为持久保存消息,并且只需很少或不需要更改代码即可参与XA事务.