我来自EJB后台,从事异步消息处理的mdb工作。最近,我被转移到一个使用Spring消息传递的项目。作为Spring JMS侦听器的新手,在比较并发语义和mdb时,我有点困惑。
MDB -据我所知,我们不需要担心线程安全,它维护一个MDB bean池(池大小是我们可以配置的)。每当有新消息到达目的地(队列)时。EJB容器从池中选择一个实例并处理该消息。
Spring -我不确定我是否完全理解它。我们在容器内部定义侦听器类。我不知道它是否会用listener-class的新实例处理每个传入消息,或者它会创建一个新线程(就像我们在servlet中一样)?另一件我感到困惑的事情是可配置参数concurrentConsumers,它是否类似于我们在EJB容器中的bean池?
应用了Spring语义,因此在典型情况下,侦听器bean是单例的,您必须自己保证线程安全。当然这是微不足道的:如果你有这个
public class MDB implements MessageListener {
public void onMessage(Message inMessage) {
...blablabla...
}
}
现在你基本上可以这样写:
public class SpringMessageListener implements MessageListener {
public void onMessage(Message inMessage) {
MDB mdb = new MDB(...parameters MDB might need...);
mdb.onMessage(inMessage);
}
}