JavaEE之消息驱动Bean.docx
《JavaEE之消息驱动Bean.docx》由会员分享,可在线阅读,更多相关《JavaEE之消息驱动Bean.docx(23页珍藏版)》请在冰豆网上搜索。
![JavaEE之消息驱动Bean.docx](https://file1.bdocx.com/fileroot1/2022-12/30/e9af7b4c-fd68-472b-ba04-2c5f26b963e5/e9af7b4c-fd68-472b-ba04-2c5f26b963e51.gif)
JavaEE之消息驱动Bean
实验6.消息驱动Bean
实验内容
在本实验中将学习编写消息驱动Bean,编写消息发送程序,配置消息服务器,测试消息的发送和接收。
实验目的
◆掌握消息驱动Bean的编写。
◆掌握消息发送程序的编写。
◆掌握消息服务器的配置。
◆掌握消息发送和接收的测试。
实验介绍
本实验首先创建EJB工程,其次创建和部署消息驱动Bean,接着创建消息发送程序,然后配置消息服务器,包括消息目的和消息工厂,最后测试消息的发送和接收。
环境要求
服务器:
JBoss6.0
集成开发环境:
MyEclipse8.5/MyEclipse8.6
实验指导
步骤1:
创建EJB工程myMDB
1.在主菜单中选择【New】【EJBProject】,出现NewEJBProject对话框。
2.在NewEJBProject对话框中,ProjectName文本框中输入myMDB,J2EESpecificationLevel项选中JavaEE5.0-EJB3,具体如下图所示,点击【Finish】按钮。
图6-1
步骤2:
创建消息驱动Bean
1.在主菜单中选择【New】【EJB3MessageDrivenBean】,出现NewEJB3MessageDrivenBean对话框。
2.在NewEJB3MessageDrivenBean对话框中,Package文本框中输入ejbBeans,Name文本框中输入MyMDB,DestinationType项选中Queue,具体如下图所示,点击【Finish】按钮。
图6-2
3.MyMDB类自动形成代码如下:
packageejbBeans;
importjavax.ejb.ActivationConfigProperty;
importjavax.ejb.MessageDriven;
importjavax.jms.Message;
importjavax.jms.MessageListener;
@MessageDriven(mappedName="jms/MyMDB",activationConfig={
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="jms/MyMDB"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})
publicclassMyMDBimplementsMessageListener{
publicvoidonMessage(Messagearg0){
//TODOAuto-generatedmethodstub
}
}
注意:
以上代码中声明的这个消息驱动Bean使用的消息目的是“jms/MyMDB”。
ationConfig声明消息的确认模式和消息目的类型(队列)。
4.在onMessage方法中添加对消息处理的代码。
这里假设接收的消息是TextMessage类型、Object类型、Map类型、Stream类型,接收到消息之后把消息输出到控制台。
修改onMessage方法,类MyMDB完整代码如下:
packagecn.edu.jms.impl;
importjava.io.ByteArrayOutputStream;
importjavax.ejb.ActivationConfigProperty;
importjavax.ejb.MessageDriven;
importjavax.jms.BytesMessage;
importjavax.jms.MapMessage;
importjavax.jms.Message;
importjavax.jms.MessageListener;
importjavax.jms.ObjectMessage;
importjavax.jms.StreamMessage;
importjavax.jms.TextMessage;
importcn.edu.jms.bean.Man;
@MessageDriven(activationConfig=
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="jms/MyMDB1"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})
publicclassMyMDBimplementsMessageListener{
publicvoidonMessage(Messagemsg){
try{
if(msginstanceofTextMessage){
TextMessagetmsg=(TextMessage)msg;
Stringcontent=tmsg.getText();
System.out.println(content);
}elseif(msginstanceofObjectMessage){
ObjectMessageomsg=(ObjectMessage)msg;
Manman=(Man)omsg.getObject();
Stringcontent=man.getName()+"家住"+man.getAddress();
System.out.println(content);
}elseif(msginstanceofMapMessage){
MapMessagemap=(MapMessage)msg;
Stringcontent=map.getString("no1");
System.out.println(content);
}elseif(msginstanceofBytesMessage){
BytesMessagebmsg=(BytesMessage)msg;
ByteArrayOutputStreambyteStream=newByteArrayOutputStream();
byte[]buffer=newbyte[256];
intlength=0;
while((length=bmsg.readBytes(buffer))!
=-1){
byteStream.write(buffer,0,length);
}
Stringcontent=newString(byteStream.toByteArray());
byteStream.close();
System.out.println(content);
}elseif(msginstanceofStreamMessage){
StreamMessagesmsg=(StreamMessage)msg;
Stringcontent=smsg.readString();
System.out.println(content);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
在项目上建立一个bean,名称为Man,类Man在包cn.edu.jms.bean下,内容如下:
packagecn.edu.jms.bean;
importjava.io.Serializable;
publicclassManimplementsSerializable{
privatestaticfinallongserialVersionUID=-1789733418716736359L;
privateStringname;//姓名
privateStringaddress;//地址
publicMan(Stringname,Stringaddress){
this.name=name;
this.address=address;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
5.部署消息驱动Bean
a.如果JBoss没有启动,则启动JBoss。
b.在工具栏点击
部署按钮,出现ProjectDeployments对话框。
图6-3
c.在ProjectDeployments对话框的【Project】下拉列表框中选择“myMDB”。
点击【Add】按钮,出现NewDeployment对话框。
d.在NewDeployment对话框中,【Server】下拉列表框选择WebLogic10.x,Deploytype项选中ExplodedArchive(development),点击【Finish】,回到ProjectDeployments对话框。
点击【OK】即可。
图6-4
e.在ProjectDepolyments对话框中出现Successfullydeployed,表示部署成功。
点击【Browse】可以看到myMDB部署的路径为“%JBOSS_HOME%\server\default\deploy\myMDB”。
图6-5
f.也可以在Servers下看到部署的消息驱动Bean,如下图所示。
图6-6
步骤3:
创建消息发送程序
1.创建Java工程
a.在主菜单中选中【New】【JavaProject】,出现NewJavaProject对话框。
b.在对话框中的Projectname文本框中输入:
myMDBClient。
JRE项选择UsedefaultJRE(Currently‘jdk1.5.0_05’),点击【Next】。
注意:
JRE是系统的JDK,如果前面的实验中没有配置JRE,可以在图中点击Configuredefault…链接,进行默认JRE的配置。
图6-7
c.观察出现的JavaSettings对话框,特别是【Libraries】选项页。
点击【Finish】。
图6-8
2.创建Java类
a.右键点击工程myMDBClient,选择【New】【Class】,出现NewJavaClass对话框。
图6-9
b.在对话框的Package文本框中输入“cn.edu.jms.test”,Name文本框中输入“QueueSender”,并且选中“publicstaticvoidmain(String[]argv)”,然后点击【Finish】。
c.如果出现如下对话框,询问是否进行视图转换,可以选择点击【No】。
图6-10
3.编写消息发送程序QueueSender的代码如下:
packagecn.edu.jms.test;
importjava.util.Properties;
importjavax.jms.BytesMessage;
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.Destination;
importjavax.jms.JMSException;
importjavax.jms.MapMessage;
importjavax.jms.MessageProducer;
importjavax.jms.Queue;
importjavax.jms.Session;
importjavax.jms.StreamMessage;
importjavax.jms.TextMessage;
importjavax.naming.Context;
importjavax.naming.InitialContext;
importcn.edu.jms.bean.Man;
publicclassQueueSender{
publicstaticvoidmain(String[]args){
Connectionconn=null;
Sessionsession=null;
try{
Propertiesprops=newProperties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.setProperty(Context.PROVIDER_URL,"localhost:
1099");
props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:
org.jnp.interfaces");
InitialContextctx=newInitialContext(props);
ConnectionFactoryfactory=(ConnectionFactory)ctx.lookup("ConnectionFactory");
conn=factory.createConnection();
session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destinationdestination=(Queue)ctx.lookup("jms/MyMDB1");
MessageProducerproducer=session.createProducer(destination);
//发送文本
TextMessagemsg=session.createTextMessage("大家好,这是我的一个消息驱动Bean");
producer.send(msg);
//发送Ojbect(对象必须实现序列化,否则等着出错吧)
producer.send(session.createObjectMessage(newMan("孙悟空","花果山水帘洞")));
//发送MapMessage
MapMessagemapmsg=session.createMapMessage();
mapmsg.setObject("no1","花果山景区。
");
producer.send(mapmsg);
//发送BytesMessage
BytesMessagebmsg=session.createBytesMessage();
bmsg.writeBytes("我是一个兵,来自老百姓".getBytes());
producer.send(bmsg);
//发送StreamMessage
StreamMessagesmsg=session.createStreamMessage();
smsg.writeString("孙悟空大在取经路上");
producer.send(smsg);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
session.close();
conn.close();
}catch(JMSExceptione){
e.printStackTrace();
}
}
}
}
注意:
由于工程中没有需要的javax.jms包,因此以上代码保存编译时将出现错误。
实际上,上面的程序中不仅需要javax.jms,而且需要%JBOSS_HOME%\client下所有jar文件,下面将导入需要的jar文件。
4.向工程中添加需要的类库。
a.右键点击工程,选择【Properties】,在出现的对话框的左侧点击【JavaBuildPath】,右侧选中【Libraries】页,点击【AddExternalJars】出现NewJavaProject对话框。
图6-22
b.选择%JBOSS_HOME%\client下的所有jar,最后点击【OK】。
图6-23
图6-24
c.类库添加后,在左边的视图中出现如下内容,注意观察添加的Jar包。
步骤4:
配置消息目的和消息工程
1.进入控制台进行配置。
a.如果WebLogic没有启动,启动JBoss服务,通过http:
//localhost:
8080打开JBoss控制台,如图6-25所示,单击AdministratConsole,弹出如图6-26所示窗口。
图6-25
b.在图6-26所示窗口中输入Username及Password,均为admin。
图6-26
c.在图6-27所示窗口中,单击JMSQueue,弹出如图6-28所示窗口。
图6-27
d.在图6-28所示窗口中,单击Addnewresource,弹出如图6-29所示窗口。
图6-28
e.在图6-29所示窗口中,单击Addnewresource,弹出如图6-29所示窗口。
图6-29
f.在图6-30所示窗口中,输入相关参数,具体操作如图6-30所示。
图6-30
图6-31
g.在图6-31所示窗口中添加角色,具体操作如图6-32所示,单击OK按钮,返回到图6-31所示窗口,如图6-33所示。
图6-32
图6-33
h.出现如下配置成功的界面,如图6-34所示。
图6-34
步骤5:
测试消息的发送和接收
1.运行消息发送程序
a.右键点击工程myMDBClient中的QueueSender,选择【Runas】->【JavaApplication】
2.观察控制台的输出
图6-35
注意观察:
消息驱动Bean接收消息的顺序是否总是与发送消息的顺序一致?
实验总结
这个实验中,在Eclipse+MyEclipse8.5集成开发环境中创建了一个EJB工程,里面有一个消息驱动Bean:
MyMDB;创建了一个Java工程,里面有一个消息发送者Java类:
QueueSender;在JBoss服务器中配置了消息服务器,包括消息目的和消息工厂。