《第8章EJB应用课堂精简.ppt》由会员分享,可在线阅读,更多相关《第8章EJB应用课堂精简.ppt(81页珍藏版)》请在三一办公上搜索。
1、1,Java EE应用技术基础,济南大学信息学院 刘鹍,2,回顾:JSF,开发步骤:创建动态Web项目创建一个JSF(face-config.xml)添加JSF组件配置JSF组件(属性,确认,绑定)实施事件和导航测试部署应用程序Managed BeanJSF标签,3,补充:JavaEE概述,4,补充:典型的JavaEE应用系统层次结构,5,补充:JavaEE容器,基于组件和平台独立的JavaEE使分层的企业分布式应用程序容易开发,因为各种应用的功能逻辑被封装在可重用的JavaEE组件中。另外JavaEE服务器以容器的形式为所有JavaEE组件提供底层公共服务,因此您不必再为这些底层公共服务伤脑
2、筋,而可以专注于解决应用系统的商业问题。容器(Container)是组件和支持组件功能的底层特定平台(如数据库、分布式的网络环境及Java虚拟机等)之间的接口。在运行Web组件、企业Bean组件或者JavaEE客户端组件之前,您必须将它们装配到一个JavaEE应用程序中,并部署它们到容器中。,6,补充:JavaEE容器,JavaEE的容器类型,7,补充:JavaEE应用打包与部署,JAR/WAR/EAR文件格式JAR是Java技术中的一种与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩
3、和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。,8,补充:JavaEE应用打包与部署,JAR/WAR/EAR文件格式WAR和EAR文件也是Java技术中的一种与平台无关的文件格式,也同样允许将许多文件组合成一个压缩文件。与JAR文件不同的是,WAR文件除了可以组合JSP文件和servlet类文件等web组件程序文件之外,还可以包含GIF文件、静态HTML文件等多种其它类型的文件。EAR文件则主要用于由多个JavaEE应用模块所构成的一个完整应用
4、程序的打包,其可以包含多个JAR文件和WAR文件。从打包粒度上讲,按由小至大的顺序排列,分别是JAR、WAR和EAR。,9,补充:JavaEE应用打包与部署,JAR、WAR和EAR文件的一般目录结构,10,补充:JavaEE应用开发角色,企业Bean开发者提供企业Bean的EJB JAR文件Web组件开发者的工作任务是提供WAR文件JavaEE应用程序客户端开发者也提供一个JAR文件应用程序组装者将从组件开发者获得的组件文件装配成一个JavaEE应用程序EAR文件。应用程序部署者和系统管理员配置和部署JavaEE应用程序,在程序运行时管理计算机和网络结构,并且监控运行时环境。包括设置事务控制、
5、安全属性和指定数据库连接。,11,补充:Java 5语言新特性,12,补充:Java 5语言新特性,增强的for循环注释annotation枚举enum泛型类型自动转换静态导入格式化输入与输出,13,补充:Java 5语言新特性,加强的For循环:未增强的For:增强后的For:局限性:不可以在迭代期间访问迭代器或下标,int sum=0;Integer numbers=computeNumbers();for(int i=0;i numbers.length;i+)sum+=numbersi;,int sum=0;for(int number:computeNumbers()sum+=num
6、ber;,14,补充:Java 5语言新特性,注释(annotation)的作用可以被用来生成文档,检查代码间依赖关系,帮助编译器作语法检查。代码检查举例:,public class Parent public void foo()System.out.println(Original Implementation of foo);,public class Child extends Parent Override public void fob()System.out.println(Overide Implementation of foo);,错误提示:Child.java:3:met
7、hod does not override a method from its superclass Override 1 error,15,补充:Java 5语言新特性,内置注释类型 Override(覆写):Override 应该仅用于方法(不用于类、包声明或其他构造),它指明注释的方法将覆盖超类中的方法。Deprecated(不赞成使用):与 Override 一样,Deprecated 是标记注释,Deprecated 应该与正在声明为过时的方法放在同一行中。SuppressWarnings(压制安全警告):SupressWarnings 与 Override 和 Deprecated
8、 不同,是具有变量的,例如:SuppressWarings(value=unchecked),16,补充:Java 5语言新特性,枚举enum类型:在enum中定义方法和变量:,public enum Color Red,Green,Blue;private static int number=Color.values().length;public static Color getRandomColor()long random=System.currentTimeMillis()%number;switch(int)random)case 0:return Color.Red;case 1
9、:return Color.Green;case 2:return Color.Blue;default:return Color.Red;,17,补充:Java 5语言新特性,枚举enum类型:遍历所有枚举值:,for(Color c:Color.values()System.out.println(“find value:”+c);,18,补充:Java 5语言新特性,范型定义:所谓范型是指类型参数化(parameterized types)。Java是一种强类型的语言,在J2SE 1.4以及以前的版本中,我们在定义一个Java类的接口或者方法的时候,必须指定变量的类型。在声明范型类、接口
10、或者函数时,定义变量的时候不指定某些变量的具体类型,而是用一个类型参数代替。在使用这个类、接口或者方法的时候,这个类型参数由一个具体类型所代替。,19,补充:Java 5语言新特性,其他新特性:类型自动转换静态导入格式化输出与输入,20,补充:Java EE应用服务器,21,补充:Java EE应用服务器,Sun GlassFish金蝶ApusicJBoss,22,第8章 开发EJB3.0应用,23,第8章 开发EJB3.0应用,学习要点:1了解EJB3.0的基础知识。2了解EJB3.0中的Bean类型。3掌握会话Bean。4掌握消息驱动Bean。,24,第8章 开发EJB3.0应用,8.1
11、EJB3.0概述 8.2 会话Bean 8.3 消息驱动Bean,25,8.1 EJB3.0概述,Enterprise JavaBeans(EJB)是一种服务器端的软件组件模型,是J2EE的基础和最重要的部分。如今开发电于商务平台已大量使用组件技术,这是因为组件技术提供了服务器上的自治、企业级和分布式功能,并帮助开发者在不同颗粒度级别上定义和封装系统功能。,26,8.1 EJB3.0概述,8.1.1 传统的EJB8.1.2 EJB3.0简介8.1.3 EJB3.0中的Bean类型,27,8.1.1 传统的EJB,引入 Enterprise JavaBeans(EJB)是为了构建分布式组件。最初
12、,该技术承诺可以解决 CORBA的所有问题并降低其复杂性。作为J2EE的核心,EJB经历了几次较大的修订,并加入了许多特性,因而变得臃肿起来。随着 EJB 规范的相继发布,它还变得越来越复杂了。由于其复杂性和本身庞大的体系,传统的EJB技术被喻为一头笨重的大象。,28,8.1.2 EJB3.0简介,Do more with less workJava EE 5的正式宣言在JavaEE 5中采用了EJB3.0技术规范实现的EJB技术在这方面作出了改进的努力。EJB3.0减轻了开发人员进行底层开发的工作量,它取消或最小化了很多(以前这些是必须实现)回调方法的实现,并且降低了实体Bean及O/R映射
13、模型的复杂性。EJB3.0规范与Java Persistence 1.0的规范紧密结合,借鉴了轻量级企业数据对象的很多优点,将Java Persistence 1.0的规范运用到EJB3.0的Entity Bean中,大大提高了Entity Bean的开发效率,也使Entity Bean更加通用、简洁、轻巧。32+1,29,8.1.3 EJB3.0中的Bean类型,EJB 3.0中的组件分为三个主要类别:会话Bean、消息驱动Bean和实体Bean。根据Bean处理状态、事务和持久性的方式这些类别还可以进一步细分,如会话Bean可分为无状态会话Bean和有状态会话Bean;实体Bean可分为C
14、MP(Container Mangement Persitence)方式的实体Bean和BMP(Bean Mangement Persitence)方式的实体Bean。,30,第8章 开发EJB3.0应用,8.1 EJB3.0概述 8.2 会话Bean 8.3 消息驱动Bean,31,8.2 会话Bean,8.2.1 会话Bean的生命周期8.2.2 无状态会话Bean8.2.3 有状态会话Bean8.2.4 会话Bean实例8.2.5 将会话Bean发布为web服务,32,8.2.1 会话Bean的生命周期,如果是无状态无状态session bean,其生命周期如下:1)当bean实例不存在
15、时,容器调用bean类的newInstance()方法,开始bean的生命周期。2)接着,容器调用bean的setSessionContext()方法,进而调用ejbCreate()方法。此时,bean就创建完毕,其方法可供调用了。3)当容器不需要该bean实例的时候,容器调用bean的ejbRemove()方法,删除该实例。,33,8.2.1 会话Bean的生命周期,而有状态session bean的生命周期则复杂一些,因为涉及到钝化、激活和事务,其生命周期如下:1)当客户调用create(args)时,容器调用newInstance()方法,剩下来的创建过程同无状态session bean
16、。2)有状态session bean的方法执行分为事务与非事务两种情况。3)钝化与激活。bean长久没有被操作时,容器会决定该bean是否应该被钝化。钝化后一段时间仍然没有被操作,容器会将其从存储介质中删除。若钝化后被调用,容器会激活该bean,让其重新载入内存。4)当容器不需要该bean实例的时候,容器调用ejbRemove()方法,删除该实例。,34,8.2.2 无状态会话Bean,无状态会话Bean是这样一种EJB,其服务的业务过程只需要单个业务方法即可完成。由于它们不需维护客户多个方法调用间的会话状态,因此它是无状态的。在每次方法调用结束后,EJB容器可能会销毁无状态会话Bean实例,
17、或者实例化新的实例,或者清除掉上次方法调用中的相关信息。当然,EJB容器还可能保留前一会话Bean实例,并且供其他所有客户使用,从而实现同一会话Bean实例的重用,至于具体的实现策略则与具体EJB容器相关。,35,8.2.3 有状态会话Bean,有状态会话Bean是这样一种EJB,即其服务的业务过程能够延伸到多个方法请求或者事务中。为完成这种业务过程,有状态会话Bean需要为单个客户保存状态信息。如果在方法调用期间有状态会话Bean的状态发生改变,则这种改变必须反映到同一客户的随后调用中。,36,8.2.4 会话Bean实例,在EJB3.0规范中,写一个无状态会话Bean(Stateless
18、Session Bean)只需要为一个普通的Java类加上Stateless注释(annotation)就可以了。这个Bean可以实现某个业务接口(Business Interface)也可以不实现它。,37,8.2.5 将会话Bean发布为web服务,在EJB2.1就规定了无状态会话Bean(Stateless Session Bean)对Web Service的支持,而在EJB3.0中运用注释(annotation)就可以轻松把一个无状态会话Bean发布为Web服务。需要注意的是:只有无状态会话Bean可以发布成Web Service;要暴露给Web服务客户端的业务方法必须是public的
19、;Bean类可以通过WebService注释的endpointInterface元素实现一个Service Endpoint Interface(SEI),但这不是必须的,如果没有这样一个endpointInterface,SEI也能被隐含定义。,38,例子:开发一个会话bean,39,例子:开发一个会话bean,首先我们先定义一个接口:HelloEjb.java然后实现该接口:HelloEjbBean.java,package cn.edu.ujn.ejb.test;public interface HelloEjb public String hello(String name);,pac
20、kage cn.edu.ujn.ejb.test.impl;import cn.edu.ujn.ejb.test.HelloEjb;public class HelloEjbBean implements HelloEjb public String hello(String name)/TODO Auto-generated method stubreturn name+:hello EJB!;,40,例子:开发一个会话bean,刚才的实现类只是一个普通的Java类,并不是EJB。下面我们给实现类加入两个注释Stateless,Remote,第一个注释定义这是一个无状态会话 Bean,第二个
21、注释指明这个无状态Bean的 remote 接口。,package cn.edu.ujn.ejb.test.impl;import cn.edu.ujn.ejb.test.HelloEjb;StatelessRemote(HelloEjb.class)public class HelloEjbBean implements HelloEjb public String hello(String name)/TODO Auto-generated method stubreturn name+:hello EJB!;,41,例子:开发一个会话bean,打包发布到JBoss中去(copy到JBos
22、s的serverdefaultdeploy目录下)。,42,例子:开发一个会话bean,我们写一个client来测试该EJB首先把JBoss的client目录下所有的jar包添加到该工程的classpath中然后新建一个测试类:TestClient.java,package test;/省略掉importpublic class TestClient public static void main(String args)Properties props=new Properties();props.setProperty(java.naming.factory.initial,org.jnp
23、.interfaces.NamingContextFactory);props.setProperty(java.naming.provider.url,localhost:1099);InitialContext ctx;try ctx=new InitialContext(props);HelloEjb helloejb=(HelloEjb)ctx.lookup(HelloEjbBean/remote);System.out.println(helloejb.hello(刘鹍);catch(NamingException e)System.out.println(e.getMessage(
24、);,43,例子:开发一个会话bean,着重说一下Jboss EJB JNDI名称默认的命名规则:,1)如果 EJB 打包进后缀为*.ear的 JavaEE发布文件,默认的 JNDI路径名称是访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote例:EJB HelloEjb打包进名为HelloEjb.ear的JavaEE应用,访问它远程接口的 JNDI名是:HelloEjb/HelloEjbBean/remote2)如果 EJB 应用打包成后缀为*.jar的发布文
25、件,默认的 JNDI路径名称是访问本地接口:EJB-CLASS-NAME/local访问远程接口:EJB-CLASS-NAME/remote例:HelloEjb 应用打包成 HelloEjb.jar 文件,访问它远程接口的 JNDI名称是:HelloEjbBean/remote另外有一点要注意:EJB-CLASS-NAME 是不带包名的,如 cn.edu.ujn.test.HelloEjbBean只需取HelloEjbBean。,44,例子:开发一个会话bean,运行结果:下面我们再看一个只存在 Local接口的无状态 SessionBean,新建HelloEjbLocalBean.java,
26、同样实现HelloEjb这个接口。,package cn.edu.ujn.ejb.test.impl;import javax.ejb.Local;import javax.ejb.Stateless;import cn.edu.ujn.ejb.test.HelloEjb;StatelessLocal(HelloEjb.class)public class HelloEjbLocalBean implements HelloEjb public String hello(String name)return name+:hello Local Stateless EJB!;,45,例子:开发一
27、个会话bean,新建一个index.jsp,46,例子:开发一个会话bean,通过eclipse把该web project也部署到JBoss中去通过浏览器访问该jsp页面,结果如下:,47,例子:开发一个会话bean,思考:Spring跟EJB的bean管理思想对比Springxml管理EJBJNDI管理得到一个bean的实例:Spring这样得到:EJB这样得到:,ApplicationContext ctx=new FileSystemXmlApplicationContext(src/applicationContext.xml);Human human=null;human=(Huma
28、n)ctx.getBean(chinese);human.speak();,InitialContext ctx=new InitialContext(props);HelloEjb helloejb=(HelloEjb)ctx.lookup(HelloEjbLocalBean/local);,48,例子:开发一个会话bean,下面我们来开发一个有状态的会话bean:我们用课本上做加法的例子(适当修改)首先新建接口Add.java,该接口必须实现Serializable接口,并实现该接口:,package cn.edu.ujn.ejb.test;import java.io.Serializa
29、ble;public interface Add extends Serializablepublic int doAdd(int i,int j);public int getTotal();,package cn.edu.ujn.ejb.test.impl;import javax.ejb.Remote;import javax.ejb.Stateful;import cn.edu.ujn.ejb.test.Add;StatefulRemote(Add.class)public class AddBean implements Add private int total=0;private
30、 int addresult=0;public int doAdd(int i,int j)addresult=i+j;return addresult;public int getTotal()total=total+addresult;return total;,49,例子:开发一个会话bean,新建一个client测试类TestStateful.java,public static void main(String args)/TODO Auto-generated method stubProperties props=new Properties();props.setPropert
31、y(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);props.setProperty(java.naming.provider.url,localhost:1099);props.setProperty(java.naming.factory.url.pkgs,org.jboss.naming);InitialContext ctx;try ctx=new InitialContext(props);Add addejb=(Add)ctx.lookup(AddBean/remote);System.ou
32、t.println(addresult:+addejb.doAdd(1,2);System.out.println(total:+addejb.getTotal();System.out.println(-);Add addejb1=(Add)ctx.lookup(AddBean/remote);System.out.println(addresult:+addejb1.doAdd(3,4);System.out.println(total:+addejb1.getTotal();catch(NamingException e)System.out.println(e.getMessage()
33、;,50,例子:开发一个会话bean,把EJB打包,部署到JBoss的serverdefaultdeploy目录下运行结果如下:,51,Java EE应用技术基础,济南大学信息学院 刘鹍,52,回顾:EJB,JAR、WAR和EAREJB:32+1会话BeanSLSB SFSB会话Bean部署,53,回顾:EJB,会话bean调用InitialContextLookup与Spring对比Bean的管理方式SLSB、SFSB与Spring中对应,InitialContext ctx=new InitialContext(props);HelloEjb helloejb=(HelloEjb)ctx.
34、lookup(HelloEjbLocalBean/local);,54,回顾:EJB,JNDIJava Naming and Directory Interface为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI提供的接口,能够通过名字定位用户、机器、网络、对象服务等。NamingDNSDirectory简单的RDBMSJNDI的主要用途:使用JNDI获得对JAVA事务API中的UserTransaction接口的引用借助于JNDI,连接到资源工厂,比如JDBC、JMS等。在EJB组件中,借助于JNDI查找其他的EJB组件,55,回顾:EJB,JNDI编程:JND
35、I类编程过程,javax.naming.Context(interface)其中INITIAL_CONTEXT_FACTORY 和PROVIDER_URL。javax.naming.Naming(interface)javax.naming.InitialContext(class)其中lookup()、list()、bind()、createSubcontext()、unbind()Java.util.Propertes(class)其中setProperties()和getProperties()、list(),/设置初始化上下文的参数,主要是设置JNDI驱动的类名/java.naming
36、.factory.initial和提供命名服务的的URL-java.naming.provider.url,/java.naming.factory.initial的值因提供JNDI服务器的不同而不同,/java.naming.provider.url的值包括提供命名服务的主机地址和端口号。Properties p=new Properties();p.setProperty(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);p.setProperty(java.naming.provider.url,lo
37、calhost:1099);/初始化上下文环境,生成一个上下文实例InitialContext jndiContext=new InitialContext(p);Object lookupObject=jndiContext.lookup(“jndiname”);,56,回顾:EJB,着重说一下Jboss EJB JNDI名称默认的命名规则:,1)如果 EJB 打包进后缀为*.ear的 JavaEE发布文件,默认的 JNDI路径名称是访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local访问远程接口:EAR-FILE-BASE-NAME/EJB-CLAS
38、S-NAME/remote例:EJB HelloEjb打包进名为HelloEjb.ear的JavaEE应用,访问它远程接口的 JNDI名是:HelloEjb/HelloEjbBean/remote2)如果 EJB 应用打包成后缀为*.jar的发布文件,默认的 JNDI路径名称是访问本地接口:EJB-CLASS-NAME/local访问远程接口:EJB-CLASS-NAME/remote例:HelloEjb 应用打包成 HelloEjb.jar 文件,访问它远程接口的 JNDI名称是:HelloEjbBean/remote另外有一点要注意:EJB-CLASS-NAME 是不带包名的,如 cn.e
39、du.ujn.test.HelloEjbBean只需取HelloEjbBean。,57,第8章 开发EJB3.0应用,8.1 EJB3.0概述 8.2 会话Bean 8.3 消息驱动Bean,58,8.3 消息驱动Bean,8.3.1 为什么要使用消息8.3.2 Java消息服务8.3.3 集成JMS和EJB8.3.4 开发消息Bean8.3.5 消息事务*8.3.6 集群消息*8.3.7 负载均衡*,59,8.3.1 为什么要使用消息,当服务器需要耗费较长的时间(几小时或着有时甚至是几天)来对这些请求作出响应。客户端程序(应用)要与服务器连接并耗费如此长的时间来等待结果,这是毫无意义的。因此
40、通信应该是异步发生的。消息系统的运行机制:一旦请求被提交,它就被放置在队列中,同时客户端与服务器断开连接。然后服务器从指定的队列中选出请求进行处理,并将处理得到的消息放置在另一个消息队列里。最后,客户端程序从这个队列中选出处理结果,获得响应。,60,8.3.2 Java消息服务,Java消息服务(Java Message Service,JMS)是一个Java API,它定义了消息的客户程序如何以一种标准化的形式与底层的消息服务提供者交互。JMS提供了一种接口,底层消息服务提供者通过该接口向客户程序提供 JMS消息服务。JMS提供了点对点消息模式(Point-to-Point)和发布-订阅消息
41、模式(Publish-Subscribe)。,61,8.3.3 集成JMS和EJB,会话 Bean可以发送 JMS 消息并同步接收 JMS 消息,但不是异步方式。为避免占用服务器资源,可能希望在服务器端组件中使用异步接收。要异步接收消息,就使用消息驱动型 Bean。消息驱动bean大大地简化了创建一个JMS使用者,创建和配置一个JMS消息使用者这些功能都交由EJB容器来做了。开发人员只需简单地实现消息驱动bean的接口,配置给EJB服务器,用来创建一个接收消息的商业逻辑部件。,62,8.3.4 开发消息Bean,消息驱动Bean的业务接口已经被定义,对于使用JMS来说那就是MessageLis
42、tener接口,这个接口定义了OnMessage方法。在之前所有的EJB规范中,强制要求必须实现MessageDrivenBean接口,在EJB3.0中可以实现也可以不实现。但实现类必须使用MessageDriven注释。开发消息Bean需要通过MessageDriven的注释,完成实现类的开发。,63,8.3.4 开发消息Bean,开发一个消息驱动Bean新建一个EJB Project,64,新建一个MDB类,实现MessageListener接口,类型选择Queue(Point-to-Point),8.3.4 开发消息Bean,65,完成HelloMDB.java的代码,8.3.4 开发消
43、息Bean,MessageDriven(activationConfig=ActivationConfigProperty(propertyName=acknowledgeMode,propertyValue=Auto-acknowledge),ActivationConfigProperty(propertyName=destinationType,propertyValue=javax.jms.Queue),ActivationConfigProperty(propertyName=destination,propertyValue=queue/myQueue)public class H
44、elloMDB implements MessageListener public void onMessage(Message msg)try if(msg instanceof TextMessage)TextMessage tmsg=(TextMessage)msg;String content=tmsg.getText();System.out.println(content);catch(Exception e)e.printStackTrace();,66,修改jbossmq-destinations-service.xml(该文件在jboss安装目录serverdefaultde
45、ployjms下)打包,发布该消息驱动bean,8.3.4 开发消息Bean,jboss.mq:service=DestinationManager,67,8.3.4 开发消息Bean,注意:设置Queue可以不在 jbossmq-destinations-service.xml文件中,也可以放在自己的EJB中,方法如下:在META-INF下新建test-service.xml,queue/myQueue jboss.mq:service=DestinationManager,68,8.3.4 开发消息Bean,补充:META-INF中的配置文件ejb-jar.xml配置EJB的mappedN
46、ame,默认通过注释指定。*-service.xml配置消息到达的目标地址。jboss.xml为EJB指定JNDI名称,默认JBoss会自动生成JNDI名称。,69,8.3.4 开发消息Bean,ejb-jar.xml例子:,HelloEjbBeanHelloEjbBean,70,8.3.4 开发消息Bean,*-service.xml,queue/myQueue jboss.mq:service=DestinationManager,71,8.3.4 开发消息Bean,jboss.xml,HelloEjbBeanhelloEjb/remote,72,测试该消息驱动Bean,新建测试类Test
47、MDB.java,8.3.4 开发消息Bean,public static void main(String args)QueueConnection conn=null;QueueSession session=null;Properties props=new Properties();props.setProperty(java.naming.factory.initial,org.jnp.interfaces.NamingContextFactory);props.setProperty(java.naming.provider.url,localhost:1099);props.se
48、tProperty(java.naming.factory.url.pkgs,org.jboss.naming:org.jnp.interfaces);try InitialContext ctx=new InitialContext(props);QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup(ConnectionFactory);conn=factory.createQueueConnection();session=conn.createQueueSession(false,QueueSession.AU
49、TO_ACKNOWLEDGE);Destination destination=(Queue)ctx.lookup(queue/myQueue);MessageProducer producer=session.createProducer(destination);TextMessage msg=session.createTextMessage(这是我的第一个MessageDrivenBean!);producer.send(msg);catch(Exception e)/TODO Auto-generated catch blocke.printStackTrace();finallyt
50、ry session.close();conn.close();catch(JMSException e)e.printStackTrace();,73,运行结果:下面我们传递一下对象,新建一个对象User.java,该对象要实现Serializable接口。,8.3.4 开发消息Bean,74,User.java代码:,8.3.4 开发消息Bean,public class User implements Serializable private String name;/姓名private String address;/地址public String getName()return na