EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例

来源:互联网 发布:手绘sai软件打不开 编辑:程序博客网 时间:2024/05/17 02:15

本文的研究基于jboss-eap-4.3,一开始解决一个问题,接下来实验jboss-eap-4.3的一些简单属性。

1. 解决一个简单问题

问题如上一篇博客描述:jboss-eap-4.3启动时停滞在Configuring from URL: resource:jboss-log4j.xml ,详细描述可以参见链接http://kylinsoong.iteye.com/blog/793215;

问题解决:

先区别两个不同版本的JBOSS:jboss-4.2.2.GAjboss-eap-4.3:

 

jboss-4.2.2.GAjboss-eap-4.3      普通JBOSS,完全开源,相比较简单,用于简单个人的实验与测试,启动时显示启动完全过程,即启动时间。      eap(Enterprise Application)指JBOSS企业版,与jboss-4.2.2.GA相比企业版的JBOSS加入安全性,稳定性等方面的考虑,没有完全开源,用于企业部署与应用。

 

 

 

 

 

 

所以综上两个版本在功能上没有区别。

      对于经常使用普通版JBOSS的人第一次使用企业版JBOSS,启动企业版JBOSS,启动完成后不显示启动时间及启动详细过程,当启动停滞在Configuring from URL: resource:jboss-log4j.xml 时启动已经完成,完成界面如下:

 当出现上述界面说明JBOSS企业版已经启动完成,这时可以点击http://localhost:8080/查看,为什么Jboss企业版不在Console口输出大量日志呢?个人认为出于两方面原因:一是是出去JBoss性能考虑,日志输出实际是大量的IO操作,消耗大量资源;另一方面,日志信息是供开发人员测试使用,Jboss企业版,注重的是企业应用,所以,不需要向Console台输出大量日志,当然为了我们调试方便,我们可以修改相关日志配置文件,输出相关日志信息,供我们开发,调试,相关日志控制文件位置jboss-eap-4.3\jboss-as\server\<configure version>\conf\jboss-log4j.xml;

      至此http://kylinsoong.iteye.com/blog/793215提出的问题得以解决,由此可见这个问题绝对是一个新手错误,犯错的主要原因是犯错者习惯使用普通版JBOSS。

2. JBoss eap Quick starting

      关于JBoss企业版下载,参见http://kylinsoong.iteye.com/blog/784231;

JBoss目录结构:

解压jboss-eap-4.3后目录结构如下图:



 

jboss-as                  最高层目录,包含Jboss启动的脚步文件、jar文件、配置文件、工作目录等,系统设置JBOSS_HOME就是到这层目录,即(%\jboss-eap-4.3\jboss-as)seam包含JBoss seam Framework和Hibernate相关文件jboss-as\bin包含系统启动,关闭及一些系统特定脚步jboss-as\client存储Java Client Application或外部Web 容器可能使用到的配置文件和jar文件,jbossall-client.jar(上篇博客中JNDI客户端代码用到的jar)就存储于此jboss-as\docs存储了一些例子配置文件,比如要使用Entity Bean管理Oracle,可以在此位置找到Oracle JCA相关配置文件样本jboss-as\server

包含Jboss服务的配置种类,jboss提供四种配置设置:minimal,default, production, 和 all,

动时不指定,默认启动的是production设置,这四种设置分别对应jboss-as\server下四个子文件夹:

minimal:启动logging service、JNDI server、URL deployment Scanner

default:包含J2EE1.4所必须的一些service和部署J2EE所常用的一些Service,不包括JAXR   service、IIOP Service和任何集群的Service

all:基本包括所有常见service,如JAXR   service、IIOP Service和任何集群的Service等

production:基于all配置,加入了日志冗长处理(减少),每隔60秒扫描一次部署组建功能,和内存按需分配等,也是默认的启动选项

jboss-as\server\production\conf包含Jboss启动的引导文件jboss-service.xml,该文件包含jboss要启动的核心服务的描述jboss-as\server\production\deploy包括热部署服务,你部署的服务(jar、war、ear)jboss-as\server\production\conf\props包含一些安全设置的配置文件,例如解压完修改此文件下jmx-console-users.properties文件,你才可以访问jmx-console,否则你没有权限jboss启动实例run.bat -c production -b 0.0.0.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

启动完成后可以通过http://localhost:8080/jmx-console/来访问JMX Console,如果没有权限访问,修改jboss-as\server\production\conf\props下jmx-console-users.properties配置文件;

3. Jboss服务器构架

分析一个关于Jboss服务器构架的图片



Jboss模块的构架是建立在底层JMX之上;

JMX作为底层总线,基于可插入式的服务器设计理念(EJB容器,Web服务等);

容器的设计采用反射机制;

JBOSS主要模块:

 

EJB Container JBoss服务器的核心实现,它有两个特性,第一是在运行期产生EJB 对象的Stub和Skeleton类,第二是支持热部署Web Server支持Web容器和Servlet引擎JBossTxJBossTX架构被设计成为可以使用任何的实现了JTA接口的交易管理JBossCxJBossCX实现了部分JCA的功能。JCA制订了J2EE应用组件如何访问基于连接的资源(数据库)Deployment支持EJB(jar)、Web应用文档(war)和企业级应用文档(ears)的部署。它会时刻关心J2EE应用的URL情况,一旦它们被改变或出现的时候将自动部署。JBossSx安全相关的实现JBossNSJBossNS是JBoss命名服务用来定位对象和资源。它实现了JNDI J2EE规范JBossMQJBossMQ使Java 消息规范(JMS)的实现

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

关于JMX

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架,JMX致力于解决分布式系统管理的问题。JMX可以看做分为三层:表现层(实现层)、代理层、分布式服务层,如下图所示,最下面属于表现层,中间代理层,最上面属于分布式服务层:

表现层:JMX可管理资源所在的层,这些已管理的资源可以编写或封装为MBean,MBean分为四种类型: 标准、动态、开放、模型;

代理层:代理层相当于一个MBean服务器,用来管理MBean如何和分布式层的服务连接,连接这些分布式服务一般用的是相关的Adapter或连接器;

分布式服务层:如RMI管理应用、基于浏览器的管理控制等
详细可以参考:http://www.blogjava.net/mlh123caoer/archive/2007/09/03/142456.html

4. EJB 容器 on JBoss

重申两个名词:

EJB:可部署的组件,能够被装配成完整的解决方案

EJB容器:提供一组标准服务:分布式对象、事务、持久性、安全性和并发性 

客户端与JBOSS EJB组件系统的交互

 

 由图可见EJB客户端与EJB组件的交互主要是与EJB各类bean之间的交互;

 企业Bean的组成部分:

 

Enterprise Bean类

业务逻辑核心,不包含与网络有关的逻辑功能;

依照明确定义的接口并且遵守某些规则,能运行于任何EJB容器中;

实现javax.ejb.SessionBean/EntityBean/MessageDrivenBean接口

客户端不直接对实际的Enterprise Bean类的实例进行调用

远程接口

复制Bean类公开的所有商务逻辑方法,具有网络功能;
扩展javax.ejb.EJBObject接口,遵守RMI-IIOP参数传递约定,远程对象(EJB Object)的方法必须抛出java.rmi.RemoteException异常;

EJB Object是EJB容器的一部分;

客户端调用EJB Object中的方法

Home接口:EJB工厂

EJB Object的生成库:生成EJB Object,查找现存的EJB Object,删除EJB Object,负载均衡等;
扩展javax.ejb.EJBHome接口,遵守RMI-IIOP参数传递约定,方法必须抛出java.rmi.RemoteException异常;

EJB Home Object是EJB容器的一部分;

客户端从Home接口获得对EJB Object的引用

本地接口

如果调用的Enterprise Bean在同一进程中,不必经过Stub、Skeleton、网络调用以及参数的编组和解组;

扩展javax.ejb.EJBLocalObject接口;

通过引用而不是值来对参数进行编组;

本地Home接口

通过本地调用创建或查找EJB,与本地接口对应

部署描述文件:ejb-jar.xml描述文件名:ejb-jar.xml
确定要运行的是哪一种EJB、Home接口、远程接口和Bean类的名字等信息;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 向JBoss EJB容器中部署一个EJB2.0的HelloWorld应用:

Step 1:定义企业bean HelloWorldBean

Java代码  收藏代码
  1. public class HelloWorldBean implements SessionBean {  
  2.       
  3.     private SessionContext mySessionCtx;  
  4.       
  5.     public SessionContext getMySessionCtx() {  
  6.         return mySessionCtx;  
  7.     }  
  8.   
  9.     public void setMySessionCtx(SessionContext mySessionCtx) {  
  10.         this.mySessionCtx = mySessionCtx;  
  11.     }  
  12.   
  13.     public void ejbCreate() throws EJBException, RemoteException{  
  14.         System.out.println("EJB Created");  
  15.     }  
  16.       
  17.     public void ejbActivate() throws EJBException, RemoteException {}  
  18.   
  19.     public void ejbPassivate() throws EJBException, RemoteException {}  
  20.       
  21.     public void ejbRemove() throws EJBException, RemoteException {}  
  22.   
  23.     public void setSessionContext(SessionContext arg0) throws EJBException,  
  24.             RemoteException {}  
  25.   
  26.     public String helloWorld() throws EJBException, RemoteException{  
  27.         return "Hello World.  Welcome to EJB!";  
  28.     }  
  29.   
  30. }  

 

Step 2:定义远程接口HelloWorld

Java代码  收藏代码
  1. public interface HelloWorld extends EJBObject {  
  2.     public String helloWorld() throws RemoteException;  
  3. }  

 Step 3:定义Home接口HelloWorldHome

Java代码  收藏代码
  1. public interface HelloWorldHome extends EJBHome {  
  2.     public HelloWorld create() throws CreateException, RemoteException;  
  3. }  

 

Step 4: 定义部署描述文件ejb-jar.xml

Xml代码  收藏代码
  1. <?xml version="1.0"?>    
  2. <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>  
  3. <ejb-jar>  
  4.     <enterprise-beans>  
  5.         <session>  
  6.             <ejb-name>HelloWorld</ejb-name>  
  7.             <home>com.home.ejb.home.HelloWorldHome</home>  
  8.             <remote>com.home.ejb.remote.HelloWorld</remote>  
  9.             <ejb-class>com.home.ejb.bean.HelloWorldBean</ejb-class>  
  10.             <session-type>Stateless</session-type>  
  11.             <transaction-type>Bean</transaction-type>  
  12.         </session>  
  13.     </enterprise-beans>  
  14. </ejb-jar>  

 Step 5:定义JNDI描述文件jboss.xml

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="gb2312"?>    
  2. <jboss>    
  3.     <enterprise-beans>    
  4.         <session>    
  5.             <ejb-name>HelloWorld</ejb-name>    
  6.             <jndi-name>ejb/HelloWorld</jndi-name>    
  7.         </session>    
  8.     </enterprise-beans>    
  9. </jboss>  

 Step 6:定义打包部署文件build.xml

Xml代码  收藏代码
  1. <?xml version="1.0"?>    
  2. <project name="com.home.ejb" default="deploy" basedir="..">    
  3.     
  4.     <property environment="env" />    
  5.     <property name="app.dir" value="${basedir}\com.home.ejb" />    
  6.     <property name="src.dir" value="${app.dir}\src" />    
  7.     <property name="jboss.home" value="${env.JBOSS_HOME}" />    
  8.     <property name="jboss.server.config" value="production" />    
  9.     <property name="build.dir" value="${app.dir}\build" />    
  10.     <property name="build.classes.dir" value="${build.dir}\classes" />    
  11.     
  12.     <path id="build.classpath">    
  13.             <fileset dir="${jboss.home}\client">    
  14.                 <include name="*.jar" />               
  15.             </fileset>    
  16.             <pathelement location="${build.classes.dir}" />    
  17.     </path>    
  18.          
  19.     <target name="prepare" depends="clean">    
  20.             <mkdir dir="${build.dir}" />    
  21.             <mkdir dir="${build.classes.dir}" />    
  22.     </target>    
  23.          
  24.     <target name="clean">    
  25.             <delete dir="${build.dir}" />    
  26.             <delete file="${jboss.home}\server\${jboss.server.config}\deploy\helloworld.jar" />    
  27.     </target>    
  28.          
  29.     <target name="compile" depends="prepare" >    
  30.             <javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on" optimize="off" includes="com/**">    
  31.                 <classpath refid="build.classpath" />    
  32.             </javac>    
  33.     </target>    
  34.          
  35.     <target name="ejbjar" depends="compile" >    
  36.         <jar jarfile="${app.dir}\helloworld.jar">     
  37.             <fileset dir="${build.classes.dir}">    
  38.                 <include name="com/**/*.class" />    
  39.             </fileset>    
  40.             <metainf dir="${app.dir}/META-INF">  
  41.                 <include name="ejb-jar.xml" />  
  42.                 <include name="jboss.xml" />  
  43.              </metainf>  
  44.         </jar>    
  45.     </target>    
  46.          
  47.     <target name="deploy" depends="ejbjar">    
  48.         <copy file="${app.dir}\helloworld.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy" />    
  49.     </target>    
  50.     
  51. </project>    

 

Step 7:ant运行build.xml,将组件部署到Jboss,部署成功Jboss console口会出现如下信息:

 http://localhost:8080/jmx-console/HtmlAdaptor下Global JNDI Namespace会出现如下JNDI绑定信息:

 Step 8:编写客户端调运代码:

Java代码  收藏代码
  1. public class HelloWorldClient {  
  2.     public static void main(String[] args) {  
  3.         Properties properties = new Properties();     
  4.         properties.setProperty(Context.INITIAL_CONTEXT_FACTORY , "org.jnp.interfaces.NamingContextFactory");  
  5.         properties.setProperty(Context.PROVIDER_URL, "jnp://localhost");  
  6.         try {  
  7.             Context ctx = new InitialContext(properties);  
  8.             Object objRef = ctx.lookup("ejb/HelloWorld");    
  9.               
  10.             HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(objRef, HelloWorldHome.class);  
  11.               
  12.             HelloWorld helloworld = home.create();  
  13.             System.out.println(helloworld.helloWorld());  
  14.         } catch (NamingException e) {  
  15.             e.printStackTrace();  
  16.         } catch (RemoteException e) {  
  17.             e.printStackTrace();  
  18.         } catch (CreateException e) {  
  19.             e.printStackTrace();  
  20.         }   
  21.     }  
  22. }   

Step 9:运行客户端代码:

如上客户端代码功能可分为三步如下:

1. 执行JNDI检索,找出Home对象
2. 使用Home接口,创建一个EJB实例
3. 利用EJB实例,调用业务方法

Java代码  收藏代码
  1. Hello World.  Welcome to EJB!  

Step 10:Eclipse下文件详细描述:

 Step 11: 运行流程分析:

整个客户端调运企业bean总helloworld方法可以分为以用如下图描述:



1.检索Home对象引用
2.返回Home对象引用/Stub
3.创建新的EJB对象
4.生成EJB对象
5.返回EJB对象引用/Stub
6.调用业务方法
7.将请求委托给Bean

0 0
原创粉丝点击