1、JAVA编码规范与指南 JBOSS使用指南 Release v1.0 jimmy(yang.kun),于2008-05-12编写神州数码融信质量管理体系 一JBOSS入门21.下载和安装JBoss22.JBoss的目录结构23.启动服务器34.JMX控制台45.停止服务器56.JBoss中的部署5二JBOSS的配置61. JBoss日志设置62. web 服务的端口号的修改63. JBoss 的安全设置73.1 jmx-console 登录的用户名和密码设置73.2 web-console 登录的用户名和密码设置94. JBoss 数据源的配置125. JMS使用和设置145.1 JMS消息的
2、传递模型145.2 JMS的配置16三JMX原理和应用201. 什么是JMX202. JMX规范213. 基于JBoss来写MBean213.1 HelloWorld实例213.2 程序代码213.3 配置文件jboss-service.xml223.4 将实例部署到JBOSS223.5 MBean的效果23s四EJB3.0使用说明251. Enterprice JavaBeans(EJB)的概念251.1 会话 Bean:251.2 实体Bean:261.3 消息驱动Bean(MDB):262.会话Bean(Session Bean)262.1因为客户端需要通过JNDI 查找EJB,那么JN
3、DI 是什么262.2 Stateless Session Beans(无状态bean)开发282.3 Stateless Session Bean与Stateful Session Bean的区三别322.4 Session Bean的生命周期323.消息驱动Bean (Message Driven Bean)333.1 Queue消息的发送与接收(PTP消息传递模型)333.2 Topic消息的发送与接收(Pub/sub 消息传递模型)394.实体Bean(Entity Bean)444.1持久化persistence.xml 配置文件444.2实体Bean 发布前的准备工作454.3单表
4、映射的实体Bean45一JBOSS入门1.下载和安装JBoss 在下载和安装JBoss之前,请开发者确认一下自己的机器是否安装了最新版的JVM。为运行JBoss 4.2.2GA,开发者必须提供Java 5虚拟机。在我们动身之前,请再次检查一下您是否安装了合适的JDK,而且JAVA_HOME环境变量是否已经设置好。用户可以从JBoss网站(http:/www.jboss.org/jbossas/downloads/)免费下载到JBoss应用服务器。其中,可用的二进制版本格式分别有.zip、.tar.gz以及.bz2。JBoss二进制发布版的具体内容与版本格式无关,用户需要根据各自的平台选择相应的
5、二进制版本。在您下载完成JBoss后,将它解压到合适的机器位置上。有一点请注意,包含解压目录的完整路径(比如,Windows操作系统中的Program Files目录)上不能够含有空格,因为这将导致错误的出现。 2.JBoss的目录结构安装JBoss 会创建下列目录结构:目录描述bin启动和关闭JBoss 的脚本client客户端与JBoss 通信所需的Java 库(JARs)docs配置的样本文件(数据库配置等)docs/dtd在JBoss 中使用的各种XML 文件的DTD。lib一些JAR,JBoss 启动时加载,且被所有JBoss 配置共享。server各种JBoss 配置。每个配置必须
6、放在不同的子目录。子目录的名字表示配置的名字。JBoss 包含3 个默认的配置:minimial,default 和all,在你安装时可以进行选择。server/allJBoss 的完全配置,启动所有服务,包括集群和IIOP。server/defaultJBoss 的默认配置,它含有大部分J2EE应用所需的标准服务。但是,它不含有JAXR服务、IIOP服务、或者其他任何群集服务。 server/minimal这是启动JBoss服务器所要求的最低配置。minimal配置将启动日志服务、JNDI服务器以及URL部署扫描器,以找到待部署的(新)应用。对于那些不需要使用任何其他J2EE技术,而只是使用
7、自定义服务的场合而言,则这种JMX/JBoss 配置最适合。它仅仅是服务器,而不包含Web容器、不提供EJB和JMS支持。 server/default/conf含有指定JBoss核心服务的jboss-service.xml文件。同时,还包括核心服务的其他配置文件。 server/default/data这一目录存储持久化数据,即使服务器发生重启其中的数据也不会丢失。许多JBoss服务将数据存储在这里,比如Hypersonic数据库实例。 server/default/deploy用户将应用代码(JARWAREAR文件)部署在此处。同时,deploy目录也用于热部署服务(即,那些能够从运行服务
8、器动态添加或删除的服务)。因此,用户能够在deploy目录看到大量的配置文件。尤其是,用户能够看到JMX控制台应用(未打包的WAR文件),本书前面讨论过。JBoss服务器将定期扫描该目录,从而查找是否有组件更新或修改,从而自动完成组件的重新部署。 server/default/lib服务器配置所需的JAR文件。用户可以添加自身的库文件,比如JDBC驱动,等等。 server/default/log日志信息将存储到该目录。JBoss使用Jakarta Log4j包作为其日志功能。同时,用户可以在应用中直接使用Log4j日志记录功能。 server/default/tmp供部署器临时存储未打包应用
9、使用,也可以作为其他用途。 server/default/work供编译JSP使用。 其中,data、log、tmp、work目录是JBoss创建的。如果用户没有启动过JBoss服务器,则这些目录不会被创建。 既然提到了JBoss中的热部署服务主题,接下来在探讨服务器配置问题前先来看看实际例子。如果还没有启动JBoss,则请运行它。然后,请再次查看deploy目录(用户必须保证运行了default配置),然后删除mail-service.xml文件。通过运行JBoss服务器的控制台能够浏览到如下信息: 13:10:05,235 INFO MailService Mail service jav
10、a:/Mail removed from JNDI 然后,再次将mail-service.xml文件放回原处,用户将通过控制台再次发现JBoss重新部署了该服务。所以,这就是JBoss的热部署。3.启动服务器 首先,来看看如何运行JBoss服务器。用户可以在JBoss主安装目录的bin目录中找到若干个脚本文件。请执行run脚本(对于Windows,则运行run.bat;对于Linux、OS X、UNIX系统,则运行run.sh)。默认jboss运行default配置,如果要运行all配置请执行命令 run c all。其中,部署和启动JBoss组件的具体日志信息能够在运行JBoss的控制台浏览
11、到。如下消息表明,JBoss服务器成功运行: 11:18:46,828 INFO Server JBoss (MX MicroKernel) 4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139) Started in 27s:94ms用户可以通过Web浏览器验证JBoss应用服务器是否在运行,其HTTP监听端口为8080(其中,必须保证在启动JBoss时,8080端口并没有被其他应用或服务占用)。通过Web浏览器能够找到相关有用的JBoss资源(译者注:http:/localhost:8080)。4.JMX控制台 通过http:/l
12、ocalhost:8080/jmx-console,即JMX控制台应用,用户能够浏览到服务器活动视图。图1.1给出了示例界面。 上述界面给出了JBoss管理控制台,它提供了构成JBoss服务器的JMX MBean原始视图。我们暂时可以不用理会控制台的任何内容,但是需要知道控制台能够提供运行中的JBoss应用服务器的大量信息。另外,通过它,用户能够修改、启动、停止JBoss组件。 比如,请找到service=JNDIView链接,然后单击。该特定MBean提供了如下服务内容,即能够浏览服务器中JNDI命名空间的结构信息。接下来,请在该MBean显示页面底端找到list操作,然后单击invoke按
13、钮。invoke操作将返回绑定到JNDI树中的当前名字列表,这对于获得EJB名字很有帮助,比如当EJB应用客户端不能够解析EJB名字时。 图1-1 JMX管理控制台Web应用视图5.停止服务器 为了能够停止JBoss服务器,用户可以敲入Ctrl-C,或者从bin目录运行shutdown脚本。甚至,用户还可以使用管理控制台(请在jboss.system部分找到type=Server,然后调用shutdown操作。)。6.JBoss中的部署JBoss 中的部署过程非常的简单、直接。在每一个配置中,JBoss 不断的扫描一个特殊目录的变化:jboss 安装目录/server/config-name/
14、deploy此目录一般被称为“部署目录”。你可以把下列文件拷贝到此目录下:* 任何jar 库(其中的类将被自动添加到JBoss 的classpath 中)* EJB JAR*WAR (Web Appliction aRrchive)* EAR (Enterprise Application aRchive)* 包含JBoss MBean 定义的XML 文件* 一个包含EJB JAR、WAR 或者EAR 的解压缩内容,并以.jar、.war 或者.ear 结尾的目录。要重新部署任何上述文件(JAR、WAR、EAR、XML 等),用新版本的文件覆盖以前的就可以了。JBoss 会根据比较文件的时间发
15、现改变,然后部署新的文件。要重新部署一个目录,更新他的修改时间即可。二JBOSS的配置1. JBoss日志设置Log4j是JBoss使用的日志功能包。通过conf/jboss-log4j.xml文件能够控制JBoss的日志功能。该文件定义了一套Appender、指定了日志文件、具体消息Category类型的存储、消息格式以及消息的过滤级别。默认时,JBoss会同时在控制台和日志文件(位于log/server.log文件中)中生成输出信息。 一共存在5个基本的日志级别:DEBUG、INFO、WARN、ERROR以及FATAL。其中,控制台的日志入口(threshold)为INFO,即用户通过控制
16、台能够浏览到提示信息、警告信息、错误信息,但是调试信息查看不到。相比之下,JBoss并没有为server.log文件设置任何入口,因此所有生成的消息将记录到server.log文件中。如果JBoss运行过程中出现了错误,则通过控制台可能找不到用户有用的信息,因此建议通过server.log文件查看是否有调试信息可供解决问题所用。然而,请注意,通过调整日志入口能够在控制台查看到调试信息,但是这并没有保证所有的JBoss消息都将记录到server.log文件中。因此,用户还需要为单个的Category设置不同的日志级别。比如,jboss-log4j.xml给出了如下Category。 2. web
17、 服务的端口号的修改这点在前文中有所提及,即修改JBoss安装目录server/default/deploy/jboss-web.deployer下的server.xml文件,内容如下:将上面的8080端口修改为你想要的端口即可。重新启动JBoss后访问:http:/localhost/:新设置的端口,可看到JBoss的欢迎界面。3. JBoss 的安全设置3.1 jmx-console 登录的用户名和密码设置 默认情况访问 http:/localhost:8080/jmx-console 就可以浏览jboss的部署管理的一些信息,不需要输入用户名和密码,使用起来有点安全隐患。下面我们针对此问
18、题对jboss进行配置,使得访问jmx-console也必须要知道用户名和密码才可进去访问。步骤如下:3.1.1 修改jboss-web.xml文件打开/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml文件,去掉java:/jaas/jmx-console的注释。修改后的该文件内容为: java:/jaas/jmx-console3.1.2 修改web.xml文件与3.1.1中的jboss-web.xml同级目录下的web.xml文件,查找到节点,去掉它的注释,修改后该部分内容为: HtmlAdaptor An exampl
19、e security config that only allows users with the role JBossAdmin to access the HTML JMX console web application /* GET POST JBossAdmin 在此处可以看出,为登录配置了角色JBossAdmin。3.1.3修改login-config.xml文件在第一步中的jmx-console安全域和第二步中的运行角色JBossAdmin都是在login-config.xml中配置,我们在JBoss安装目录/server/default/config下找到它。查找名字为:jmx-
20、console的application-policy: props/jmx-console-users.properties props/jmx-console-roles.properties 在此处可以看出,登录的角色、用户等的信息分别在props目录下的jmx-console-roles.properties和jmx-console-users.properties文件中设置,分别打开这两个文件。其中jmx-console-users.properties文件的内容如下:# A sample users.properties file for use with the UsersRole
21、sLoginModuleadmin=admin该文件定义的格式为:用户名=密码,在该文件中,默认定义了一个用户名为admin,密码也为admin的用户,读者可将其改成所需的用户名和密码。jmx-console-roles.properties的内容如下:# A sample roles.properties file for use with the UsersRolesLoginModuleadmin=JBossAdmin, HttpInvoker该文件定义的格式为:用户名=角色,多个角色以“,”隔开,该文件默认为admin用户定义了JBossAdmin和HttpInvoker这两个角色。配
22、置完成后读者可以通过访问: http:/localhost:8088/jmx-console/ ,输入jmx-console-roles.properties文件中定义的用户名和密码,访问jmx-console的页面。如图:3.2 web-console 登录的用户名和密码设置 默认情况下,用户访问JBoss的web-console时,不需要输入用户名和密码,为了安全起见,我们通过修改配置来为其加上用户名和密码。步骤如下:3.2.1修改jboss-web.xml文件打开server/default/deploy/management/console-mgr.sar /web-console.w
23、ar/WEB-INF/jboss-web.xml文件,去掉java:/jaas/web-console的注释,修改后的文件内容为: java:/jaas/web-console jboss.admin:service=PluginManager3.2.2 修改web.xml文件打开3.2.1中jboss-web.xml同目录下的web.xml文件,去掉部分的注释,修改后的该部分内容为: HtmlAdaptor An example security config that only allows users with the role JBossAdmin to access the HTML
24、 JMX console web application /* GET POST JBossAdmin 3.2.3 修改login-config.xml文件打开JBoss安装目录server/default/conf下的login-config.xml文件,搜索web-console,可找到如下内容: web-console-users.properties web-console-roles.properties 在文件中可以看到,设置登录web-console的用户名和角色等信息分别在login-config.xml文件所在目录下的web-console-users.properties和
25、web-console-roles.properties文件中,但因为该目录下无这两个文件,我们在JBoss安装目录server/default/conf/props三目录下建立这两个文件,文件内容可参考在“jmx-console登录的用户名和密码设置”中的两个相应的配置文件的内容,web-console-users.properties文件的内容如下:# A sample users.properties file for use with the UsersRolesLoginModuleadmin=adminweb-console-roles.properties文件的内容如下:# A
26、sample roles.properties file for use with the UsersRolesLoginModuleadmin=JBossAdmin,HttpInvoker因为此时这两个文件不与login-config.xml同目录,所以login-config.xml文件需进行少许修改,修改后的元素的内容为: props/web-console-users.properties props/web-console-roles.properties 4. JBoss 数据源的配置在 jboss路径docsexamplesjca目录下有各种数据库配置文件的样本。选择一个你合适的
27、,copy到 serveralldeploy 或 serverdefaultdeploy 下, 我们以msserver数据库为列 ,然后修改其中的如下内容 : DEV_MSSQLDS jdbc:sqlserver:/192.168.14.201:1455;DatabaseName=Beta_Core_Psmsg_Beta6 com.microsoft.sqlserver.jdbc.SQLServerDriver ppcn_beta6 ppcn_beta6 5 800 5 MS SQLSERVER2000 如果后台没有报异常,通过http:/localhost:8080/jmx-console进
28、入jmx控制台,在jdbc栏目可以看到以下内容:代码示例:javax.naming.InitialContext ctx = new InitialContext();javax.sql.DataSource ds = (DataSource)ctx.lookup(“java:/DEV_MSSQLDS”);另外请注意:该配置文件可随意命名为 XXXX-ds.xml,该命名的后辍请确保为-ds.xml。5. JMS使用和设置Java 消息服务(Java Message Service,简称JMS)是企业级消息传递系统,紧密集成于Jboss Server 平台之中。企业消息传递系统使得应用程序能够
29、通过消息的交换与其他系统之间进行通信。下图说明jboss JMS 消息传递。5.1 JMS消息的传递模型JMS 支持两种消息传递模型:点对点(point-to-point,简称PTP)和发布/订阅(publish/subscribe,简称pub/sub)这两种消息传递模型非常相似,只有以下区别:PTP 消息传递模型规定了一条消息只能传递给一个接收方。Pub/sub 消息传递模型允许一条消息传递给多个接收方。每种模型都通过扩展公用基类来实现。例如,PTP 类javax.jms.Queue 和pub/sub 类javax.jms.Topic 都扩展javax.jms.Destination 类。5
30、.1.1 点对点消息传递通过点对点(PTP) 的消息传递模型,一个应用程序可以向另一个应用程序发送消息。PTP 消息传递应用程序使用命名队列发送接收消息。队列发送方(生成者)向特定队列发送消息。队列接收方(使用者)从特定队列接收消息。下图说明PTP 消息传递。一个队列可以关联多个队列发送方和接收方,但一条消息仅传递给一个队列接收方。如果多个队列接收方正在监听队列上的消息,jboss JMS 将根据“先来者优先”的原则确定由哪个队列接收方接收下一条消息。如果没有队列接收方在监听队列,消息将保留在队列中,直至队列接收方连接队列为止。5.1.2 发布/订阅消息传递仅仅允通过发布/订阅(pub/sub
31、) 消息传递模型,应用程序能够将一条消息发送到多个应用程序。Pub/sub 消息传递应用程序可通过订阅主题来发送和接收消息。主题发布者(生成器)可向特定主题发送消息。主题订阅者(使用者)从特定主题获取消息。下图说明pub/sub 消息传递。与PTP 消息传递模型不同,pub/sub 消息传递模型允许多个主题订阅者接收同一条消息。JMS 一直保留消息,直至所有主题订阅者都收到消息为止。上面两种消息传递模型里,我们都需要定义消息发送者和接收者,消息发送者把消息发送到Jboss JMS 某个Destination,而消息接收者从Jboss JMS 的某个Destination 里获取消息。消息接收者
32、可以同步或异步接收消息,一般而言,异步消息接收者的执行和伸缩性都优于同步消息接收者,体现在:1异步消息接收者创建的网络流量比较小。单向推动消息,并使之通过管道进入消息监听器。管道操作支持将多条消息聚合为一个网络调用。2异步消息接收者使用的线程比较少。异步消息接收者在不活动期间不使用线程。同步消息接收者在接收调用期间内使用线程。结果,线程可能会长时间保持空闲,尤其是如果该调用中指定了阻塞超时。3对于服务器上运行的应用程序代码,使用异步消息接收者几乎总是最佳选择,尤其是通过消息驱动Bean。使用异步消息接收者可以防止应用程序代码在服务器上执行阻塞操作。而阻塞操作会使服务器端线程空闲,甚至会导致死锁
33、。阻塞操作使用所有线程时则发生死锁。如果没有空余的线程可以处理阻塞操作自身解锁所需的操作,则该操作永远无法停止阻塞。Message-Driven Bean 由EJB 容器进行管理,具有一般的JMS 接收者所不具有的优点,如对于一个Message-driven Bean,容器可创建多个实例来处理大量的并发消息,而一般的JMS 使用者(consumer)开发时则必须对此进行处理才能获得类似的功能。同时Message-Driven Bean 可取得EJB 所能获得的标准服务,如容器管理事务等服务。5.2 JMS的配置当使用一个JMS Provider时,有三个Provider-specific因素:A 得到一个JNDI初始化上下文B 用到的连接工厂的名字。C 对目的地的管理和命名协