📄 14.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="description" content="Java,JDBC,EJB,Open Source,jdk,rmi">
<meta name="Keywords"
content="Java, servlets, Java servlet, Javascript, ActiveX, VRML,
applet, applets, directory, news, jdbc, applications,
Java applications, Java developer, Java development, developer,
classes, Jars.com, Jars, intranet, Java applet, Javabeans,
Java products, JDK, Java development kit, java development environment, JIT,
JavaPlan, enterprise tools, JVM, Java Virtual Machine, Java resources,
SUN, CGI, Perl, database, network, html,
xml, dhtml, rating, ratings, review, jars, cgi, programming,
software review, software rating">
<title>csdn_J2EE的异步消息机制(下)</title>
<style>
.news { BACKGROUND: #007cd3; font-family: "宋体"; font-size: 9pt }
.t { font-family: "宋体"; font-size: 9pt }
.t1 { color:#007cd3; font-family: "宋体"; font-size: 9pt }
.white { font-family: "宋体"; font-size: 9pt;color:#FFFFFF }
.red { font-family: "宋体"; font-size: 9pt;color:#FF0000 }
A:visited {color:#0000FF}
A:hover {color: #ff6666; text-decoration: none}
.text {font-size: 12px; line-height: 160%; font-family: "宋体"}
.text1 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text1:visited {color:#000000}
.text1:hover {color: #000000}
.text2 {color:#000000; font-size: 12px; line-height: 130%; font-family: "宋体"; text-decoration: none}
.text2:visited {color:#000000}
.text2:hover {color: #000000}
.text3 {font-size: 12px; line-height: 100%; font-family: "宋体"; text-decoration: none}
.large {font-size: 14.8px; line-height: 130%}
</style>
</head>
<body
<center>
<tr>
<td WIDTH="100%" VALIGN="TOP">
<tr>
<td WIDTH="100%" CLASS="white"></td>
</tr>
<div align=center>
<tr>
<td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>J2EE的异步消息机制(下) </td>
<p> <td WIDTH="50%" bordercolor="#FFFFFF" CLASS="t1" bgcolor="#F0F0F0" align="center" nowrap>作者:云起 </td></p>
</tr></div>
<tr> <td WIDTH="100%" bordercolor="#FFFFFF" CLASS="t" bgcolor="#F0F0F0" colspan="2">
<BR><BR><SPAN
class=content><STRONG>三.消息驱动豆简介</STRONG> <BR> 异步消息也可以由消息驱动豆来实现。在EJB
1.1规范中,定义了两种类型的EJB。分别是实体豆(Entity Bean)和会话豆(Session
Bean)。客户端通常是以同步的,阻塞方式来调用豆的方法。消息驱动豆将EJB和JMS的功能结合在一起。
<BR><BR> 正如前述,会话豆通常实现商务逻辑,客户端不能共享一个会话豆。实体豆通常和一些在永久存储中的一些实体条目相对应的。这两种豆通常都有REMOTE和HOME接口,用来与客户端交互。并且,这些交互都是同步的,阻塞方式进行的。比如,一个请求发送给一个豆,通过阻塞式方法调用,服务器返回一个相应。调用者在收到返回后,才能进行下一步处理。消息驱动豆通常配置成是一个特别的主题(topic)或队列的客户端,作为消息的使用者。但消息驱动豆没有HOME和REMOTE接口。一个消息产生者将消息写入TOPIC或队列时,并不知道使用者是一个消息驱动豆。这就允许集成一个分布式的计算系统时,有很大的灵活性。消息驱动豆没有会话性质的状态,所有的实例在不处理请求时是相同的,这与无状态会话豆是类似的。将豆的实例放在缓冲池里,也是高效处理消息驱动豆的一种方法。一个消息驱动豆必须间接或直接地从javax.ejb.MessageDrivenBean接口继承而来。这个接口是由javax.jms.MessageListener继承而来。这个方法的一个参数是javax.jms.Message。可以是任何有效的JMS消息类型。方法的申明中并不包含一个thrown语句。因此在消息处理中,不会仍出应用程序异常。当容器接收到消息时,它首先是从一个缓冲池里得到现成的一个消息驱动豆,然后,如果配置文件需要的,容器还要设置一个和事务处理上下文的一个联系。当这些管理任务完成时,接收到的消息传递给onMessage()方法。一旦方法完成,事务确认或返回,豆又被重新放回到缓冲池。
<BR><BR> ejbRemove()在把消息驱动豆从任何存储上删除时调用。并进行清楚操作和垃圾收集。必须在ejbRemove()方法中释放所有豆的实例用到的资源。
<BR><BR> setMessageDrivenConnection()方法只有一个参数-javax.ejb.MessageDrivenContext的实例。MessageDrivenContext类与在实体和会话豆中的上下文类似。当一个豆的实例创建时,容器传入豆用的上下文。上下文中得到环境信息的方法,以及JTA
UserTranscation类,用于豆管理事务处理的场合。
<BR><BR> 另外,豆提供者必须提供一个ejbCreate()方法(无参数),用于在EJB服务器对豆进行设置。豆实例可以在ejbCreate()方法中取得任何需要的资源。
<BR><BR> 消息驱动豆大大地简化了创建一个JMS使用者,创建和配置一个JMS消息使用者这些功能都交由EJB容器来做了。开发人员只需简单地实现消息驱动豆的接口,配置给EJB服务器,用来创建一个接收消息的商业逻辑部件。
<BR><BR><STRONG>四.一个实例</STRONG>
<BR> 本文为了说明上面的概念,编写了一个消息驱动豆,一个Publisher和一个Subscriber的代码。请参见附录的源代码。
<BR><BR> 下面讲一下怎样运行实例。这里假设读者已经从SUN主页上下载了J2EE SDK 1.3 Bate,并已经安装好了。
<BR><BR> 1.创建一个WeatherReport <BR><BR> 主题(Topic):
<BR><BR> j2eeadmin -addJmsDestination WeatherReport topic
<BR><BR> 可以用下面命令看一下是否正确创建: <BR><BR> D:\j2sdkee1.3\bin>j2eeadmin
-listJmsDestination JmsDestination <BR><BR> 一般显示结果如下:
<BR><BR> < JMS Destination : jms/Topic , javax.jms.Topic >
<BR><BR> < JMS Destination : jms/Queue , javax.jms.Queue >
<BR><BR> < JMS Destination : WeatherReport , javax.jms.Topic
> <BR><BR> 2.运行Subscriber:
<BR><BR> D:\mysourcecode\testjms><A name=TRSHL1><FONT
color=red>java</FONT></A>
-Djms.properties=%J2EE_HOME%\config\jms_client.properties jmssub
<BR><BR> 一般显示结果如下: <BR><BR> Topic name is WeatherReport
<BR><BR> <A name=TRSHL2><FONT color=red>Java</FONT></A>(TM) Message
Service 1.0.2 Reference Implementation (build b10) <BR><BR> To end
program, enter Q or q, then <return> <BR><BR> Reading
message: A sunny day. <BR><BR> 3.运行Publisher:
<BR><BR> 打开另一个命令行窗口,输入下面命令: <BR><BR> set
classpath=%J2EE_HOME%\lib\j2ee.jar;. <BR><BR> <A name=TRSHL3><FONT
color=red>java</FONT></A>
-Djms.properties=%J2EE_HOME%\config\jms_client.properties jmspub
<BR><BR> 一般显示结果如下: <BR><BR> Topic name is WeatherReport
<BR><BR> <A name=TRSHL4><FONT color=red>Java</FONT></A>(TM) Message
Service 1.0.2 Reference Implementation (build b10)
<BR><BR> Publishing message: A sunny day. <BR><BR> 4.删除一个话题
<BR><BR> D:\j2sdkee1.3\bin>j2eeadmin -removeJmsDestination
MyTopic <BR><BR> 5.使用消息驱动豆
<BR><BR> 下面是用消息驱动豆实现接受消息。使用deploytool将附录中的Bean部署好,可以看到下面的信息:
<BR><BR> Deploying message driven bean MsgBean, consuming from
WeatherReport <BR><BR> Application testjms deployed.
<BR><BR> 然后再次运行Publisher。可以看到消息驱动豆输出下面的结果: <BR><BR> MESSAGE BEAN:
Message received: A sunny day. <BR><BR>
</td>
</tr>
</td>
</tr>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -