好学IT学院:IT信息技术分享交流平台
标签:J2EE  来源:BlogJava  作者:Lynn-Munsinger/草儿  发布时间:2009-02-03  ★★★加入收藏〗〖手机版
摘要:EJB3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB。如果真是这种情况,那么祝贺你,你已经成功避免了在你以前EJB开发者的很多挫折,并且享受到EJB3.0开发的便利性。但是你开始开发以前,你可能想知道EJB是什么和它们用于什么目的。本篇文章…

消息驱动Bean

驱动Bean (MDB) 提供了一个实现异步通信比直接使用Java消息服务(JMS)更容易地方法。创建MDB接收异步JMS消息。容器处理为JMS队列和主题所要求加载处理的大部分工作。它向相关的MDB发送所有的消息。一个MDB允许J2EE应用发送异步消息,该应用能处理这些消息。实现javax.jms.MessageListener接口和使用@MessageDriven注释该Bean来指定一个Bean是消息驱动Bean。

消息驱动Bean实例

import javax.ejb.MessageDriven;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.Inject;
import javax.jms.*;
import java.util.*;
import javax.ejb.TimedObject;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName="connectionFactoryJndiName",

propertyValue="jms/TopicConnectionFactory"),
@ActivationConfigProperty(propertyName="destinationName",

propertyValue="jms/myTopic"),
@ActivationConfigProperty(propertyName="destinationType",

propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="messageSelector",

propertyValue="RECIPIENT = 'MDB'")
}
)

/**
*监听可配置JMS队列或者主题和通过当一个消息发送到队列或者主题
*调用它的onMessage()方法得到提醒的一个简单的消息驱动
*该Bean打印消息的内容
*/

public class MessageLogger implements MessageListener, TimedObject
{

@Inject javax.ejb.MessageDrivenContext mc;

public void onMessage(Message message)
{
System.out.println("onMessage() - " + message);
try
{
String subject = message.getStringProperty("subject");
String inmessage = message.getStringProperty("message");
System.out.println("Message receivedntDate: " + new java.util.Date() +

"ntSubject: " + subject + "ntMessage: " + inmessage + "n");
System.out.println("Creating Timer a single event timer");
TimerService ts = mc.getTimerService();
Timer timer = ts.createTimer(30000, subject);
System.out.println("Timer created by MDB at: " +

new Date(System.currentTimeMillis()) +" with info: "+subject);
}
catch (Throwable ex)

}

public void ejbTimeout(Timer timer)
{
System.out.println("EJB 3.0: Timer with MDB");
System.out.println("ejbTimeout() called at: " +

new Date(System.currentTimeMillis()));
return;
}
}

使用EJB

客户端是访问Bean的应用程序。虽然没有必要保存在客户层,但是能够作为一个独立的应用,JSP,Servlet,或者另一个EJB。客户端通过Bean的远程或者本地接口访问EJB中的方法,主要取决于客户端和Bean运行在同一个还是不同的JVM中。这些接口定义了Bean中的方法,而由Bean类实际实现这些方法。当一个客户端访问该Bean类中的一个方法时,容器生成Bean的一个代理,被叫做远程对象或者本地对象。远程或者本地对象接收请求,委派它到相应的Bean实例,返回结果给客户端。调用一个Bean中的方法,客户端使用定义在EJB不是描述文件的名字查找到Bean。在以下实例中,客户端使用上下文对象找到命名为"StateLessejb" Bean。

EJB客户端实例

import javax.naming.Context;
import javax.naming.InitialContext;

/**
* 一个调用无状态会话Bean中方法的简单的Bean客户端
*/

public class CalculateejbClient
{
public static void main(String [] args)
{
Context context = new InitialContext();
CalculateEJB myejb =
(CalculateEJB)context.lookup("java:comp/env/ejb/CalculateEJB");
myejb.incrementValue();
}
}

总结

EJB 3.0开发企业JavaBean是相当容易的。此规范使用元数据注释定义Bean的类型和暴露给客户端的方法。因此,无论你将创建一个执行特定任务的会话Bean还是映射一个表到实体Bean来更新数据,你都能象使用普通Java对象和接口一样进行处理,在业务方法中使用元注释向客户端暴露方法。既然你已经理解了EJB的基础,可以到OTN中EJB 3.0 Resources Page发现更多信息。