JBOSS是一种组件化的微内核结构,其组成包括一个服务器内核和各种扩展组件,并通过JMX(Java Management Extension)来连接管理各种扩展组件,其实现的扩展组件包括JTS/JTA组件、安全管理(JAAS)组、数据源组件、远程管理件等等,所有组件以Bean服务的方式连接加载到服务器内核中。我们可以通过定制特定的服务器实例,使用所需要的组件,以符合我们的开发应用要求。在以下的介绍中,我们使用的是JBOSS4.0.4GA版本,如果不做特别说明,$JBOSS_HOME指的就是JBOSS的安装路径。
JBoss的一般有如下几个目录bin、lib、client、server,我们将分别介绍。
1.bin目录主要是一些在各种操作系统中启动服务和停止服务的脚本和启动停止包,以windows为例,是run.bat和shutdonw.bat脚本,可以通过在命令台下运行脚本来启动服务和停止服务:
1)run 启动default服务实例
2)run -c all 启动all服务实例
3)shutdown -S 关闭服务器
在开发中如果我们想让其支持调试(注意,最好只在开发时使用该参数),可以将run.bat脚本的第80行rem set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%中前面的rem去掉,如果在开发中需要支持代码改变之后立即应用而不需要重启服务器,可以将其修改为set JAVA_OPTS=-Xdebug -noagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%
2.lib
一些服务器和J2EE开发的核心包,譬如j2ee.jar可以从该包获得,在进行J2EE开发时,将该目录下的文件拷贝到你的工作区或者将你的编译、运行路径连接到该目录下
3.client
一些J2EE开发客户端需要的依赖包,同样将该目录下的文件引入到你的工作区
4.server
服务器实例,服务器默认提供了三个服务器实例,分别是all、default和minimal,其中all提供了JBOSS的所有扩展组件(包括嵌入一个TOMCAT Web容器),default提供了JBOSS大部分的组件组件,而minimal则不提供任何扩展组件。如果需要定制所需的服务器实例,可以在该目录下创建一个目录,将all下的所有文件拷贝到该目录下,在做相应的增减。
接下来将介绍各个扩展组件的使用配置,采用服务器的all服务器实例,所以在开始之前,别忘了将其启动起来run -c all
JBoss配置学习(二):日志(Log4j)
Log4j是一种日志记录工具包,起有如下几个比较重要的概念
1.日志级别分为:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF,譬如如果调用org.apache.log4j.Logger.debug(msg),那么只有当系统的日志级别小于等于DEBUG(即ALL或者DEBUG)时,该信息才会输出
2.日志追加器(Appender):日志追加器定义了日志信息以什么样的格式写到哪里,主要有ConsoleAppender和FileAppender,前者以System.out的方式输出,后者则以文件的格式输出,自定义的Appender必须实现rg.apache.log4j.Appender接口
3.日志分类(Category):日志可以对不同的分类配置不同的日志级别和日志追加器,一般以做日志记录的类的包名为日志分类,日志分类存在父子关系,譬如对于一个类ayufox.jboss.eclipse.Bootstrap进行日志,则日志分类ayufox和ayufox.jboss都对其起作用,其中ayfuox.jboss覆盖ayufox的配置,就如同ayufox.jboss继承了ayufox,ayufox.jboss的行为覆盖ayufox一样
Log4j的使用比较简单,如下
Logger logger = LogManager.getLogger(myClass);
logger.debug(...)
logger.warn(...)
JBoss使用Log4j完成日志记录的任务,见$JBOSS_HOME/server/all/config/jboss-service.xml(以all服务实例为例,下面不再强调)
[code]
<mbean code="org.jboss.logging.Log4jService" name="jboss.system:type=Log4jService,service=Logging" xmbean-dd="resource:xmdesc/Log4jService-xmbean.xml">
<attribute name="ConfigurationURL">resource:log4j.xml</attribute>
<attribute name="Log4jQuietMode">true</attribute>
<attribute name="RefreshPeriod">60</attribute>
</mbean>
[/code]
从ConfigurationURL,可以知道log4j的配置文件为$JBOSS_HOME/server/all/config/log4j.xml,详细配置的理解可以参考该文件和log4j的文档,在这里举例说明,假设我们对jms服务器端的行为做进一步了解,我们可以让其打印出更多的调试信息,则在log4j.xml中配置如下
[code]
<category name="org.jboss.mx">
<priority value="DEBUG" />
<appender-ref ref="CONSOLE"/>
</category>
[/code]
JBoss配置学习(三):命名服务(NS)
命名服务提供了让用户可以通过一个名字映射到一个对象的服务,以让用户可以使用一个可识别的名字来访问一个对象,譬如internet的DNS就是一个例子,其提供了根据域名获得IP的服务。在J2EE中使用JNDI来提供这样的一种功能。
JNDI的API包位于javax.naming下最主要的类是Context和InitContext,其提供了向命名服务提供者注册、取消注册和获得注册对象的功能,譬如EJB的扩展组件可能就会在启动时将加载EJB包并解析Bean和向命名服务提供注册,而客户端根据注册名向命名服务请求获得EJB的HOME对象。
JBoss的命名服务包括三种,远程命名服务、本地命名服务和本地ENC,其名字分别以任意、java:和java:comp开头:远程命名服务和本地命名服务的名字必须在整个服务器实例中唯一,远程目录可以通过远程访问,即客户端和服务提供端位于不同的JVM,譬如一个远程HOME接口;而本地命名服务仅可以通过本地访问,即客户端和服务位于同一个服务器实例,譬如JBOSS提供的数据源;而ENC意思是Enterprise Naming Context,其名字在同一个环境中唯一,譬如不同的应用(两个不同的Web应用)其名字可以是一样的,譬如在EJB配置中(如下),可以通过java:com/env/ejb/hello来获得该EJB,其也仅可以在同一个应用实例中访问
[code]
<ejb-ref>
<ejb-ref-name>ejb/hello</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ayufox.ejb.test.HelloHome</home>
<remote>ayufox.ejb.test.HelloObject</remote>
<ejb-link>hello</ejb-link>
</ejb-ref>
[/code]
1.服务器端配置1
命名服务JBoss提供的配置如下$JBOSS_HOME/server/all/config/jboss-service.xml
[code]
<mbean code="org.jboss.naming.NamingService" name="jboss:service=Naming" xmbeandd="resource:xmdesc/NamingService-xmbean.xml">
<attribute name="CallByValue">false</attribute>
<attribute name="Port">1099</attribute>
<attribute name="BindAddress">${jboss.bind.address}</attribute>
<attribute name="RmiPort">1098</attribute>
<attribute name="RmiBindAddress">${jboss.bind.address}</attribute>
<depends optional-attribute-name="LookupPool" proxy-type="attribute">jboss.system:service=ThreadPool</depends>
</mbean>
[/code]
各个参数意义自明,不再解释,其中BindAddress是因为有些服务器有多个网卡具有多个IP,可以通过指定某一个IP则仅向该IP访问才有效,可以通过配置该bean来改变JNDI访问端口等。
2.服务器端配置2
$JBOSS_HOME/server/all/config/jdni.properties(一般不需要重新配置)
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
3.远程客户端配置:
在运行环境路径下配置jdni.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
4.测试代码
1)获得所有远程命名对象
[code]
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> ne = ctx.list("java:");
while (ne.hasMoreElements())
{
NameClassPair cp = ne.next();
System.out.println(cp.getName());
}
[/code]
2)获得远程HOME接口
[code]
Context ctx = new InitialContext();
Object ref = ctx.lookup("java:/ejb/hello");
[/code]