2.5.2 消息驱动beans
消息驱动beans(Message-driven beans)在EJB2.0规范的时候诞生。该组件产生的动机是让EJB能够与JMS简单集成,使得EJB异步消息消费和使用标准JMS APIs一样简单。通过使用MessageListener接口,EJB通过消息推送自动从JMS提供者那里接收消息。一个MDB例子如下。
Listing 2.11 A simple message-driven bean example
import javax.ejb.EJBException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;
public class MyMessageProcessor
implements MessageDrivenBean, MessageListener {
public void onMessage(Message message) {
TextMessage textMessage = null;
try {
if (message instanceof TextMessage) {
textMessage = (TextMessage) message;
System.out.println("Received message: " + msg.getText());
processMessage(textMessage);
} else {
System.out.println("Incorrect message type: " +
message.getClass().getName());
}
} catch (JMSException jmsEx) {
jmsEx.printStackTrace();
}
}
public void ejbRemove() throws EJBException {
// This method is called by the EJB container
}
public void setMessageDrivenContext(MessageDrivenContext ctx)
throws EJBException {
// This method is called by the EJB container
}
private void processMessage(TextMessage textMessage) {
// Do some important processing of the message here
}
}
注意到例子2.11的MyMessageProcessor类实现了MessageDrivenBean和MessageListener接口。MessageDrivenBean接口需要setMessageDrivenContext()和ejbRemove的实现方法。这些方法会在创建和销毁MDB时被EJB容器调用。MessageListener接口只包含单独的一个方法onMessage()。onMessage()方法会在消息到达时被JMS提供者调用。
MDB除了允许EJB容器管理所需的所有资源,包括Java EE资源(如JDBC,JMS,JCA连接),安全,事务甚至是JMS消息应答,更重要的一个好处是可以并发地处理消息。普通的JMS客户端需要自己管理资源和环境,并且它们通常是线性处理消息--一次一条消息(除非特别地为多线程设计)。而MDB能够一次处理多条消息,因为EJB容器可以通过EJB部署描述符创建很多MDBs实例。这样的配置是在Java EE容器规范定义的。如果你使用Java EE容器,可以查看文档看是如何通过部署描述符进行配置的。
MDBs的一个缺点是它们要求完全Java EE容器支持。今天所有EJB容器中,只有那些完全支持Java EE的才能支持MDBs。MDBs在一个完全的Java EE容器中非常有用,但是也有一些替代品不要求完全的Java EE容器。使用Spring框架的JMS APIs使得开发消息驱动POJOs(message-driven POJOs)非常简单。这些Plain Old Java Objects(POJOs)可以作为消息驱动组件使用。这种开发风格在Java开发领域逐渐流行起来,因为它避免了使用完整Java EE容器的负载。通过Spring框架的开发将在第七章讨论。
不是所有的EJB容器都要求一个完全的Java EE容器----尝试使用OpenEJB
在写这本书的时候,几乎市场上所有的EJB容器都需要一个完全的Java EE容器来支持MDBs。只有Apache OpenEJB是例外。OpenEJB从EJB1.1,EJB2到EJB3都支持MDBs,它可以通过嵌入或者独立运行方式来支持MDBs。OpenEJB可以嵌入在Apache Geronimo,Apache Tomcat或者你自己的Java应用。
2.6总结
企业消息传送在商业上的影响是明显的。企业消息传送及相关的概念影响了很多而外的技术和观念。没有企业消息传送,开发者就不能在同步调用和解偶的应用间自由选择。SOA,CEP和其它高层次基于企业消息传送的观念也不会产生。更重要的是JMS规范也不会产生。
JMS规范对于Java世界的影响巨大,它使得消息传送变成Java的一部分,并且可以让所有的Java开发者使用。这对于允许Java连接商业上重要的应用非常必须,因为它为消息传送到使用提供一个标准的行为。这章的例子都非常简单和短,它们的目的是是你了解JMS。本书接下来的部分有更丰富的例子讨论,并且可以从网上下载。
现在我们对JMS及它提供什么有了一个基本的了解,下面将回顾这些例子。第三章提供的一个样例将会在全书使用。