关于JBoss
JBoss,一个领先的java开源,继承和开发基于J2EE的完整服务实现,JBoss提供JBossServer,基本的EJB容器及JMX框架。它也为JMS系统提供JBossMQ,为JTA事务提供JBossTX,为CMP持久化提供JBossCMP,为基于JAAS的安全性提供JBossSX,以及为JCA连接提供JBossCX。为支持Web组件,比如Servlet和JSP,JBoss提供了抽象集成层。而这些抽象层的继承服务实现可以由第三方Servlet引擎提供,比如Tomcat。JBoss使得开发者能够通过JMX混合应用这些组件,即借助于替换JMX兼容的组件实现完成这项任务。同时,这些JBoss组件之间不会产生任何影响,因此JBoss全部都是模块化的
JBoss是基于JMX的完整J2EE实现:JBoss的目标是提供完整的开源j2ee服务栈。JMX即java管理拓展。是集成软件的最好利器。JMX提供了公共的平台以允许集成模块。容器及插件,下图展示了JMX总线是如何于JBoss架构进行交互的
1.1 JMX - 层次
JMX是一个可复用框架,它为远程(Remote)和本地(Local)管理工具扩展了应用。它的架构是层式架构。他们是实现层(instrumentation layer)、代理层(agent layer)和发布层(distribution layer)。其中,发布层还在等待未来的标准化。简要的表述是,用户使用管理Bean,MBean来提供获得相应资源的实现方法。实现层实现相关的特性资源并将它发布于JMX相关应用中,它的代理层控制和发布相应的注册在MBeanServer代理上的管理资源。.
Figure 2-1 JMX层次模型
1.2 JBoss主要模块
主要的JBoss模块是在MeanServer上的可管理MBean。.JBoss EJB容器是JBoss服务器的核心实现。它有两个特性,第一是在运行期产生EJB 对象的Stub和Skeleton类,第二是支持热部署。
2.JBossNS是JBoss命名服务用来定位对象和资源。它实现了JNDI J2EE规范.
3.JBossTX 是由JTA/JTS支持的交易管理控制.
4.部署服务支持EJB(jar)、Web应用文档(war)和企业级应用文档(ears)的部署。它会时刻关心J2EE应用的URL情况,一旦它们被改变或出现的时候将自动部署。
5.JBossMQ使Java 消息规范(JMS)的实现。
6.JBossSX支持基于JAAS的或不支持JAAS机制的安全实现。
7.JBossCX实现了部分JCA的功能。JCA制订了J2EE应用组件如何访问基于连接的资源。
8.Web服务器支持Web容器和Servlet引擎。
JBoss起步
2.1下载和安装JBoss
本版本为jboss4.0.5,为运行JBoss4.0,必须提供Java1.4或Java1.5虚拟机。并且JAVA_HOME环境变量已经设置好,使用ANT-1.6.5以上版本,并且ANT_HOME环境变量已经设置好
从http://www.jboss.org/download/下载JBoss应用服务器。在下载完成之后,将它解压到机器合适的位置,(路径中不能包含空格如:Program Files,这样会导致错误)
2.2启动服务
在JBoss的主安装目录的bin目录下找到如下脚本文件,执行run.bat。显示如下消息
10:44:33,125 INFO [JkMain] Jk running ID=0 time=0/94 config=null
10:44:33,187 INFO [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Bran
ch_4_0 date=200610162339)] Started in 1m:59s:640ms
表明JBoss启动成功。
JBoss监听的HTTP端口为8080,通过Web浏览器就可以访问JBoss服务了
2.3JMX控制台
通过访问http://localhost:8080/jmx-console/,我们就能够浏览到服务器活动视图。通过它,我们能够修改,启动,停止JBoss组件
2.4停止服务
停止JBoss服务器,可以敲入Ctrl-C,或者从bin目录下运行shutdown脚本
JBoss的目录结构
bin 启动和关闭JBoss的脚本
client 客户端与JBoss通信所需的的Java库(JARs)
docs 配置的样本文件(数据库配置等)
doc/dtd 在JBoss中使用的各种XML文件的DTD。
lib 一些JAR,JBoss启动时加载,且被所有JBoss配置共享。(不要把你的库放在这里)
server 各种JBoss配置。每个配置必须放在不同的子目录。子目录的名字表示配置的名字。 JBoss包含3个默认的配置:minimial,default和all。
server/all JBoss的完全配置,启动所有服务,包括集群和IIOP。
server/default JBoss的默认配置。在没有在JBoss命令航中指定配置名称时使用。
server/default/conf JBoss的配置文件。
server/default/data JBoss的数据库文件。比如,嵌入的数据库,或者JBossMQ。
server/default/deploy JBoss的热部署目录。放到这里的任何文件或目录会被JBoss自动部署EJB、WAR、EAR,甚至服务。
server/default/lib 一些JAR,JBoss在启动特定配置时加载他们。 (all和minimial配置也包含这个和下面两个目录。)
server/default/log JBoss的日志文件。
server/default/tmp JBoss的临时文件。
JBoss配置数据源
Jboss中的数据库连接管理完全由JBoss JCA实现处理,如果没有为数据库提供专有的适配器。则用户需要配置使用JBoss提供的包裹了JDBC的资源适配器,用户还必须提供JDBC驱动,并提供相应的类(将驱动jar或zip文件拷贝到当前的工作的服务器配置中的lib目录)。
数据源配置文件的后缀为-ds.xml,因此JCA部署器能够正确处理它们,其中目录docs/examples/jca包含了用于各种数据库的配置实例。
4.1配置mysql数据源
1:将mysql的驱动Connector/J拷贝到lib目录下
2:将docs/examples/jca下的mysql-ds.xml文件拷贝到server/default目录下
3:修改mysql-ds.xml
<local-tx-datasource>
<jndi-name>jdbc/mydb</jndi-name> <!-- 数据源名称 -->
<connection-url>jdbc:mysql://127.0.0.1:3306/mysql</connection-url> <!--连接URL-->
<driver-class>com.mysql.jdbc.Driver</driver-class><!--数据库驱动-->
<user-name>root</user-name><!--用户名-->
<password>root</password><!--密码-->
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
JBoss控制台输出以下信心
09:36:54,578 INFO [WrapperDataSourceService] Bound ConnectionManager 'jboss.jca:name=MySqlDS,service=DataSourceBinding' to JNDI name 'java:MySqlDS'则表示数据源部署成功
4:测试数据源:
新建一WEB工程编写如下java文件
package com.qianmo.test;
public class Test extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn;
try {
Context ctx = new InitialContext();
Object datasourceRef = ctx.lookup("java:jdbc/mydb");
DataSource dataSource = (DataSource)datasourceRef;
conn = dataSource.getConnection();
String sql = "select * from user";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
}
conn.close();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
并配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>testJboss</servlet-name>
<servlet-class>com.qianmo.test.Test</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>testJboss</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
访问http://localhost:8080/testJboss/aa.do即可测试数据源
4.2配置oracle数据源
1:设置Pad值
如果查看default/conf目录中的jboss-service.xml文件,将发现如下MBean服务
<!-- The configurable Xid factory. For use with Oracle, set pad to true -->
<mbean code="org.jboss.tm.XidFactory"
name="jboss:service=XidFactory">
<!--attribute name="Pad">true</attribute-->
</mbean>
事务服务需要使用XidFactory MBean服务创建XA事务标识,其中的注释表明:如果使用Oracle数据库,则用户需要将属性Pad设置为true包括进来。这使得XA事务标识能够达到64位的最大长度。
2:将Oracle驱动程序拷贝到JBoss default的lib目录下
3:将docs/examples/jca下的oracle-xa-ds.xml文件拷贝到server/default目录下,并做如下修改
<jndi-name>jdbc/mydb</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:thin:@127.0.0.1:1521:orcl</xa-datasource-property>
<xa-datasource-property name="User">scott</xa-datasource-property>
<xa-datasource-property name="Password">tiger</xa-datasource-property>
4测试数据源
新建如下java文件
package com.qianmo.test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class TestOracle extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn;
try {
Context ctx = new InitialContext();
Object datasourceRef = ctx.lookup("java:jdbc/mydb");
DataSource dataSource = (DataSource)datasourceRef;
conn = dataSource.getConnection();
String sql = "select * from dept";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
}
conn.close();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
配置web.xml文件
<servlet>
<servlet-name>testOracle</servlet-name>
<servlet-class>com.qianmo.test.TestOracle</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testOracle</servlet-name>
<url-pattern>*.test</url-pattern>
</servlet-mapping>
Spring使用数据源
<bean id="myDataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:jdbc/mydb</value>
</property>
JBoss字符集设置
JBoss启动时默认使用的是系统字符集,而某些应用程序对于系统默认的字符集会出现不兼容的情况,如:打印出来的数据都是乱码。对于这种情况,可以在JBoss启动时定制应用程序使用自己的字符集。
设置字符集
<Connector port="8088" address="${jboss.bind.address}"
maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"
emptySessionPath="true"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gb2312"/>
部署项目
将开发好的项目打成war文件拷贝到server/default目录下
控制台显示类似信息
15:29:59,390 INFO [TomcatDeployer] deploy, ctxPath=/moveoa, warUrl=.../tmp/deploy/tmp20200moveoa-exp.war/
表示项目部署成功