本文的研究基于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.GA和jboss-eap-4.3:
jboss-4.2.2.GA |
jboss-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引擎 |
JBossTx |
JBossTX架构被设计成为可以使用任何的实现了JTA接口的交易管理 |
JBossCx |
JBossCX实现了部分JCA的功能。JCA制订了J2EE应用组件如何访问基于连接的资源(数据库) |
Deployment |
支持EJB(jar)、Web应用文档(war)和企业级应用文档(ears)的部署。它会时刻关心J2EE应用的URL情况,一旦它们被改变或出现的时候将自动部署。 |
JBossSx |
安全相关的实现 |
JBossNS |
JBossNS是JBoss命名服务用来定位对象和资源。它实现了JNDI J2EE规范 |
JBossMQ |
JBossMQ使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
- publicclassHelloWorldBeanimplementsSessionBean{
- privateSessionContextmySessionCtx;
- publicSessionContextgetMySessionCtx(){
- returnmySessionCtx;
- }
- publicvoidsetMySessionCtx(SessionContextmySessionCtx){
- this.mySessionCtx=mySessionCtx;
- }
- publicvoidejbCreate()throwsEJBException,RemoteException{
- System.out.println("EJBCreated");
- }
- publicvoidejbActivate()throwsEJBException,RemoteException{}
- publicvoidejbPassivate()throwsEJBException,RemoteException{}
- publicvoidejbRemove()throwsEJBException,RemoteException{}
- publicvoidsetSessionContext(SessionContextarg0)throwsEJBException,
- RemoteException{}
- publicStringhelloWorld()throwsEJBException,RemoteException{
- return"HelloWorld.WelcometoEJB!";
- }
- }
Step 2:定义远程接口HelloWorld
- publicinterfaceHelloWorldextendsEJBObject{
- publicStringhelloWorld()throwsRemoteException;
- }
Step 3:定义Home接口HelloWorldHome
- publicinterfaceHelloWorldHomeextendsEJBHome{
- publicHelloWorldcreate()throwsCreateException,RemoteException;
- }
Step 4: 定义部署描述文件ejb-jar.xml
- <?xmlversion="1.0"?>
- <!DOCTYPEejb-jarPUBLIC'-//SunMicrosystems,Inc.//DTDEnterpriseJavaBeans2.0//EN''http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
- <ejb-jar>
- <enterprise-beans>
- <session>
- <ejb-name>HelloWorld</ejb-name>
- <home>com.home.ejb.home.HelloWorldHome</home>
- <remote>com.home.ejb.remote.HelloWorld</remote>
- <ejb-class>com.home.ejb.bean.HelloWorldBean</ejb-class>
- <session-type>Stateless</session-type>
- <transaction-type>Bean</transaction-type>
- </session>
- </enterprise-beans>
- </ejb-jar>
Step 5:定义JNDI描述文件jboss.xml
- <?xmlversion="1.0"encoding="gb2312"?>
- <jboss>
- <enterprise-beans>
- <session>
- <ejb-name>HelloWorld</ejb-name>
- <jndi-name>ejb/HelloWorld</jndi-name>
- </session>
- </enterprise-beans>
- </jboss>
Step 6:定义打包部署文件build.xml
- <?xmlversion="1.0"?>
- <projectname="com.home.ejb"default="deploy"basedir="..">
- <propertyenvironment="env"/>
- <propertyname="app.dir"value="${basedir}\com.home.ejb"/>
- <propertyname="src.dir"value="${app.dir}\src"/>
- <propertyname="jboss.home"value="${env.JBOSS_HOME}"/>
- <propertyname="jboss.server.config"value="production"/>
- <propertyname="build.dir"value="${app.dir}\build"/>
- <propertyname="build.classes.dir"value="${build.dir}\classes"/>
- <pathid="build.classpath">
- <filesetdir="${jboss.home}\client">
- <includename="*.jar"/>
- </fileset>
- <pathelementlocation="${build.classes.dir}"/>
- </path>
- <targetname="prepare"depends="clean">
- <mkdirdir="${build.dir}"/>
- <mkdirdir="${build.classes.dir}"/>
- </target>
- <targetname="clean">
- <deletedir="${build.dir}"/>
- <deletefile="${jboss.home}\server\${jboss.server.config}\deploy\helloworld.jar"/>
- </target>
- <targetname="compile"depends="prepare">
- <javacsrcdir="${src.dir}"destdir="${build.classes.dir}"debug="on"deprecation="on"optimize="off"includes="com/**">
- <classpathrefid="build.classpath"/>
- </javac>
- </target>
- <targetname="ejbjar"depends="compile">
- <jarjarfile="${app.dir}\helloworld.jar">
- <filesetdir="${build.classes.dir}">
- <includename="com/**/*.class"/>
- </fileset>
- <metainfdir="${app.dir}/META-INF">
- <includename="ejb-jar.xml"/>
- <includename="jboss.xml"/>
- </metainf>
- </jar>
- </target>
- <targetname="deploy"depends="ejbjar">
- <copyfile="${app.dir}\helloworld.jar"todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
- </target>
- </project>
Step 7:ant运行build.xml,将组件部署到Jboss,部署成功Jboss console口会出现如下信息:
http://localhost:8080/jmx-console/HtmlAdaptor下Global JNDI Namespace会出现如下JNDI绑定信息:
Step 8:编写客户端调运代码:
- publicclassHelloWorldClient{
- publicstaticvoidmain(String[]args){
- Propertiesproperties=newProperties();
- properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
- properties.setProperty(Context.PROVIDER_URL,"jnp://localhost");
- try{
- Contextctx=newInitialContext(properties);
- ObjectobjRef=ctx.lookup("ejb/HelloWorld");
- HelloWorldHomehome=(HelloWorldHome)PortableRemoteObject.narrow(objRef,HelloWorldHome.class);
- HelloWorldhelloworld=home.create();
- System.out.println(helloworld.helloWorld());
- }catch(NamingExceptione){
- e.printStackTrace();
- }catch(RemoteExceptione){
- e.printStackTrace();
- }catch(CreateExceptione){
- e.printStackTrace();
- }
- }
- }
Step 9:运行客户端代码:
如上客户端代码功能可分为三步如下:
1. 执行JNDI检索,找出Home对象
2. 使用Home接口,创建一个EJB实例
3. 利用EJB实例,调用业务方法
Step 10:Eclipse下文件详细描述:
Step 11: 运行流程分析:
整个客户端调运企业bean总helloworld方法可以分为以用如下图描述:
1.检索Home对象引用
2.返回Home对象引用/Stub
3.创建新的EJB对象
4.生成EJB对象
5.返回EJB对象引用/Stub
6.调用业务方法
7.将请求委托给Bean
相关推荐
EJB3+JBOSS5+JPA整合,里面还用到了ejb3注解。
ejb-jboss-web实例的workspace ejb-jboss-web实例的workspace ejb-jboss-web实例的workspace
使用eclipse通过jboss开发简单的ejb应用(jboss7.x & ejb3.x),包含server和client。
EJB3.0实例教程服务器为JBOSS EJB3.0实例教程服务器为JBOSS
[2] 安装 JBoss EJB3: 16 [3] 第一次启动 JBoss: 18 [4] 安装 Eclipse WTP: 18 [5] 安装 JBoss IDE: 18 [6] 使用 Eclipse 建立第一个 EJB3 Project [ 即 HelloWorld ]: 18 [7] 建立 HelloWorld Stateless ...
ejb3 and jboss 多本合一(three) Using @Service annotation in eclipse JBoss中文文档.pdf JBOSS使用指南.doc JBOSS架构分析.doc JBOSS对EJB3_0的扩展 jbossgs4x.pdf JBoss-EJB3.0实例教程.pdf JBoss.in.Action....
jboss7以上版本发布ejb时需要的配置文件,jboss-ejb3.xml和ejb-jar.xml,缺少csdn分数所以上传,请见谅。
jboss7.1.1 final部署EJB3
经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part3
在服务器上部署文件ejb-cluster.jar并分配给group-a和group-b 在控制台日志中,您应该看到: JBAS010238:集群成员数量:2 运行java -jar ejb-client-jar-with-dependencies.jar来测试您的配置。
《经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发》介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则包含Session Bean、Message Driven Bean的...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun...
jboss7下的ejb3开发的实例,从jboss官方文档中的代码示例中拷贝到本地工程中,亲测可用,附件是完整的工程。包括一个stateless session和一个stateful session,包括测试客户端。
ejb3.0+ jboss4.2详细教程 包括: 会话bean 实体bean
该资源是下面帖子的资料,可以进去看看帖子再下载,这样能防止下的东西没用。。。。 http://blog.csdn.net/qzh3578/article/details/46489747
里面清楚的讲解各个部分, ,资料仅作参考, 有兴趣兄弟赶紧去学学啊。希望有所帮助
ejb3.0配置使用jboss7.1.1的数据源
这是ejb3.1用jboss7.1.1开发的HelloWorld文档,网上有一个和这个差不多,但是有些错误,这个是修正版的
jboss EJB3.0实例教程 jboss EJB3.0实例教程 jboss EJB3.0实例教程
巨牛X的ejb3,jboss,j2ee资料。如果不看,必然后悔。看了以后,受益匪浅。