Username: Password:

一个Message-Driven Bean的示例
来源:作者: 发布时间:2007-12-05 06:22:23

译者前言
有关本章中相应源代码的下载,请参看一个Session Bean的示例。

正文
因为message-driven bean是基于Java消息服务(JMS)技术的,要理解以下示例,您必须已熟悉基本的JMS概念,例如队列和消息。学习有关这些概念的最好的地方是Java消息服务指南:
http://java.sun.com/products/jms/tutorial/index.html
这一章讲述了一个message-driven bean示例的源代码。在开始学习前,您必须首先阅读Message-Driven Bean是什么中的基本概念。

示例应用程式概览
这个应用程式包括下列组件:
1、SimpleMessageClient:一个发送几个消息到一个队列中的J2EE应用程式客户端。
2、SimpleMessageEJB:一个异步接收和处理发送到队列中的消息的message-driven bean。
图7-1说明了这个应用程式的结构。应用程式客户端发送消息到队列中,这个队列是用j2eeadmin命令创建的。JMS供给者(在这里也就是J2EE服务器)将消息递交给一个message-driven bean的实例,这个实例将处理这个消息。
图7-1 SimpleMessageApp应用程式

在j2eetutorial/examples/src/ejb/simplemessage目录下有这个应用程式的源代码。要编译这个代码,到j2eetutorial/examples目录下。输入ant simplemessage。在j2eetutorial/examples/ears目录下有SimpleMessageApp.ear文档的示例。

J2EE应用程式客户端
SimpleMessageClient发送消息到队列中,SimpleMessageBean将对这个队列进行监听。客户端首先将定位连接factory和队列:
queueConnectionFactory = (QueueConnectionFactory)
jndiContext.lookup
("java:comp/env/jms/MyQueueConnectionFactory");
queue = (Queue)
jndiContext.lookup("java:comp/env/jms/QueueName");
然后,客户端创建队列连接、会话和发送端:
queueConnection =
queueConnectionFactory.createQueueConnection();
queueSession =
queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
queueSender = queueSession.createSender(queue);
最后,客户端向队列中发送几条消息:
message = queueSession.createTextMessage();

for (int i = 0; i < NUM_MSGS; i++) {
message.setText("This is message " + (i + 1));
System.out.println("Sending message: " +
message.getText());
queueSender.send(message);
}

Message-Driven Bean类
SimpleMessageEJB类的代码阐明了一个message-driven bean类所需满足的基本条件:
1、他实现了MessageDrivenBean接口和MessageListener接口。
2、类被定义为public。
3、类不能定义为abstract或final。
4、他实现了一个onMessage方法。
5、他实现了一个ejbCreate方法和一个ejbRemove方法。
6、他包含了一个公用的无参数的构造函数。
7、他不能定义finalize方法。
和session bean或entity bean不同,message-driven bean不具备定义客户端访问的remote接口或local接口。客户端组件不能定位message-driven bean并调用其中的方法。尽管message-driven bean不包含商业方法,但是他可能包含由onMessage方法调用的辅助方法。

onMessage方法
当队列接受到一个消息时,EJB容器调用message-driven bean中的onMessage方法。在SimpleMessageBean类中,onMessage方法将消息引入TextMessage并显示其内容:
public void onMessage(Message inMessage) {
TextMessage msg = null;

try {
if (inMessage instanceof TextMessage) {
msg = (TextMessage) inMessage;
System.out.println
("MESSAGE BEAN: Message received: "
+ msg.getText());
} else {
System.out.println
("Message of wrong type: "
+ inMessage.getClass().getName());
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}

ejbCreate方法和ejbRemove方法
这些方法必须满足以下条件:
1、访问控制修饰必须是public。
2、返回类型必须是void。
3、修饰不能是static或final。
4、throws子句不能定义任何应用程式例外。
5、这个方法没有参数。
在SimpleMessageBean类中,ejbCreate方法和ejbRemove方法为空。

运行SimpleMessageEJB示例

启动J2EE服务
要显示message-driven bean的输出,您必须使用verbose模式启动服务:
j2ee -verbose

创建队列
1、使用j2eeadmin命令创建队列:
j2eeadmin -addJmsDestination jms/MyQueue queue
2、检查队列是否已被建立:
j2eeadmin -listJmsDestination

部署应用程式
1、在deploytool中打开j2eetutorial/examples/ears/SimpleMessageApp.ear文档(FileOpen)。
2、部署SimpleMessageApp应用程式(ToolsDeploy)。在Introduction对话框中,检查是否选中Return Client JAR检验栏。周详信息请参看部署J2EE应用程式.

运行客户端
1、在一个终端窗口时,到j2eetutorial/examples/ears目录下。
2、配置APPCPATH环境变量为SimpleMessageAppClient.jar。
3、在一行中输入以下命令:
runclient -client SimpleMessageApp.ear -name
SimpleMessageClient -textauth
4、在提示登录时,输入j2ee作为用户名和口令。
5、客户端会显示以下内容:
Sending message: This is message 1
Sending message: This is message 2
Sending message: This is message 3
6、在您启动J2EE服务(用verbose模式)的终端窗口下,会显示以下内容:
MESSAGE BEAN: Message received: This is message 1
MESSAGE BEAN: Message received: This is message 2
MESSAGE BEAN: Message received: This is message 3

Message-Driven Bean的Deploytool提示
第二章概括了创建和封装enterprise bean的基本步骤。这一章我们将介绍对于message-driven bean在deploytool中必须执行的任务。要在deploytool中显示这个示例,打开j2eetutorial/examples/ears/SimpleMessageApp.ear文档并选中SimpleMessageEJB。

指定Bean的类型和事务管理
您可经在使用New Enterprise Bean向导创建bean时指定其类型。
1、要启动这个向导,选择FileNewEnterprise Bean。
2、在向导的General对话框中,选择Message-Driven按钮。
3、在Transaction Management对话框中,您能够选择Bean-Managed,也能够选择Container-Managed。假如您选择的是Bean-Managed,那么在下面一段的第4步中,您必须选择确认类型。

设定Message-Driven Bean的特征
您能够在两个地方作这个设定:
1、在New Enterprise Bean向导中的Message-Driven Bean Settings对话框
2、bean的Message标签(参见图7-2)
这些设定包括以下内容:
1、对于Destination类型,能够选择Queue也能够选择Topic。一个队列使用点对点的消息域,至多只能有一个使用者。而一个主题使用发布-订阅的消息域,他能够有零个、一个或多个使用者。
2、在Destination组合框中,选择您创建的目的地的JNDI命名。作为一个示例,您能够参看创建队列。目的地能够是个Queue对象,也能够是个Topic对象;他是引入消息的发起者和发出消息的目标。
3、在Connection Factory组合框中,选择适当的对象,这能够是个QueueConnectionFactory,也能够是个TopicConnectionFactory。这个对象出示了J2EE组件访问消息服务的连接。
4、假如您选择了bean管理事务,那么您可能需要在Acknowledgement组合框中选择确认类型--这可能是Auto-Acknowledge(自动确认)或Duplicates-OK(OK重复)。Auto-Acknowledge类型需要会话自动确认bean在使用这个消息。而Duplicates-OK类型对消息提交的确认会迟钝一些;这个类型可能会导致一个消息的复制,但是他会减少会话的开销。
5、在JMS Message Selector区域,您能够输入一个过滤bean接收到的消息的语句。
图7-2 SimpleMessageEJB的Message标签


JMS客户端的deploytool提示
有关JMS客户端的更多的信息,请参看Java消息服务指南:
http://java.sun.com/products/jms/tutorial/index.html

设定资源索引
1、选中客户端的节点。
2、选中Resource Refs标签。
3、单击Add。
4、在Coded Name中,输入和客户端的代码中的lookup方法的参数相匹配的命名。例如,假如lookup方法的参数是java:comp/env/jms/MyQueueConnectionFactory,Coded Name就应该是jms/QueueConnectionFactory。
5、在Type中,选择和目的类型相匹配的连接factory类。
6、在Authentication中,绝大多数情况下您的选择应该是Container。假如您的代码明确地登录到消息服务器,这里您能够选择Application。
7、在Sharable中,确保检验栏被选中。这个选择使得容器能够优化连接。
8、在User Name和Password中输入字符串。J2EE SDK的身份论证服务会在您运行客户端时提示您输入相关信息。

设定资源环境索引
1、选择Resource Env. Refs标签。
2、单击Add。
3、在Coded Name中,输入和定位队列和主题的lookup调用的参数相匹配的命名。例如,假如lookup的参数是java:comp/env/jms/QueueName,那么Coded Name应该是jms/QueueName。
4、在Type中,选择和目的类型相匹配的类。

指定JNDI命名
1、选中应用程式的节点。
2、选择JNDI Names标签并输入适当的命名。例如,在这一章中所讨论的SimpleMessageApp将采用表7-1中所示的JNDI命名。
表7-1 SimpleMessageApp应用程式中所使用的JNDI命名
组件名或索引名:JNDI命名
SimpleMessageEJB:jms/MyQueue
jms/MyQueueConnectionFactory:jms/QueueConnectionFactory
jms/QueueName:jms/MyQueue     
  

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅