Eclipse+Jboos开发JTA实战经验

 

Moshco zhu  2007924日星期一

 

目录

1.              预备知识... 3

1.1.         JTA. 3

1.2.         Ant. 3

1.3.         EJB. 3

1.4.         Jboss. 3

1.5.         Eclipse. 3

2.              下载与安装... 3

2.1.         软件列表... 3

2.2.         安装... 4

2.2.1.    Java安装... 4

2.2.2.    Ant安装... 4

2.2.3.    开发环境... 4

2.2.4.    数据库... 4

2.2.5.    JBoss. 4

2.2.6.    JDBC. 4

3.              开发... 5

3.1.         项目设计... 5

3.2.         开发过程... 5

3.2.1.    创建项目与配置... 5

3.2.2.    开发代码... 10

3.2.3.    Ant编译... 22

3.2.4.    配置数据源... 26

3.2.5.    发布运行... 29

3.3.         备注... 30

4.              配置调试... 30

5.              成功... 31

6.              经验之谈... 32

7.              备注... 32

7.1.         打开数据库和服务器的分布式服务... 32

7.2.         查找JNDI... 33

 

 


­

 

1.  预备知识

1.1.  JTA

Java Transaction APIJava事务API (JTA)Java Transaction API(Application Programming Interface)

JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begincommitrollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。

JTA可以处理任何提供符合XA接口的资源。包括:数据库,JMS,商业对象等等

 

1.2.  Ant

Ant是一种基于Javabuild工具。理论上来说,它有些类似于(UnixC中的make ,但没有make的缺陷。

与基于shell命令的扩展模式不同,AntJava的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。

AntApache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。
跨平台性。Ant是存Java语言编写的,所示具有很好的跨平台性。
操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)
Ant
通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。
Ant
可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。

 

1.3.  EJB

EJBsun的服务器端组件模型,最大的用处是部署分布式应用程序,类似微软的.com技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。

    EJB (Enterprise JavaBean)
J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)

   
J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话BeanSession Bean),实体BeanEntity Bean)和消息驱动BeanMessageDriven Bean)。  

 

 

1.4.  Jboss

JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。 因为JBoss代码遵循LGPL许可,你可以在任何商业应用中免费使用它,而不用支付费用。JBoss支持EJB 1.1EJB 2.0 EJB3.0的规范,它是一个管理EJB的容器和服务器。类似于Sun's J2SDK Enterprise EditionJ2EE),JBoss的目标是一个源代码开放的J2EE环境。但是JBoss核心服务仅是提供EJB服务器。JBoss不包括serverlers/JSP page WEB容器,当然可以和TomcatJetty绑定使用。

 

1.5.  Eclipse

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development ToolsJDT)。

虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development EnvironmentPDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。

 

1.6.  WTP

WTP(Web Tools Platform )项目在eclipse平台上进行扩展,是一个开发J2EE Web应用程序的工具集。WTP包含以下工具:

u  一个源码编辑器可以用来编辑HTML, Javascript, CSS, JSP, SQL, XML, DTD, XSD, WSDL

u  一个图形编辑器用来编辑XSDWSDL

u  J2EE项目构建器和一个J2EE向导工具。

u  一个Web服务创建向导和管理器,和WS-I 测试工具。

u  一个数据库访问,查询工具等。

WTP由两个子项目构成:WST(Web标准工具集) JST(J2EE标准工具集)

 

2.  下载与安装

2.1.  软件列表

 

JDK

版本:JDK5.0 Update12

下载地址:

http://java.sun.com/javase/downloads/index_jdk5.jsp

 

Ant

版本:Ant 1.7.0

下载地址:

http://ant.apache.org/

http://ant.apache.org/bindownload.cgi

 

 

Eclipse

下载地址:

版本:wtp-all-in-one-sdk-R-1.0.3-200607Eclipse 3.1.2

http://mirrors.nsa.co.il/eclipse/webtools/downloads/drops/R1.0/R-1.0.3-200607290929/wtp-all-in-one-sdk-R-1.0.3-200607290929-win32.zip

中文包下载:

http://archive.eclipse.org/eclipse/downloads/drops/L-3.1.1_Language_Packs-200510051300/index.php

 

JBoss IDE for Eclipse

版本:JBossIDE-1.6.0.GA

下载地址:
http://labs.jboss.com/jbosside/download/index.html

http://belnet.dl.sourceforge.net/sourceforge/jboss/JBossIDE-1.6.0.GA-ALL.zip

 

JBoss Application Server

版本:4.0.5.GA

下载地址:

http://labs.jboss.com/jbossas/downloads

 

Microsoft SQL Server 2000

版本:Microsoft SQL Server 2000 SQL Server 2000 SP4

 

Sybase 12.5

版本:12.5.1

 

JDBC

版本:

下载地址:SQL Server 2000 JDBC

http://download.microsoft.com/download/4/1/d/41d3e9c0-64d1-451e-947b-7a4cba273b2d/setup.exe

 

 

2.2.  安装

2.2.1.  Java安装

这就不多说了吧!要注意配置系统环境变量[Path][CLASS_PATH]

 

2.2.2.  Ant安装

1.直接将其解压缩到指定目录;

2.然后配置系统环境[Path]中添加Ant目录下的[bin]目录;

 

2.2.3.  开发环境

1.先将WTP包解压缩到[D:/1]目录;

2.解压缩JBoss IDE for Eclipse[D:/1]目录;

3.解压缩所有的语言包到[D:/1]目录;

4.[D:/1/eclipse]目录拷贝到你想安装Eclipse的目录;

 

2.2.4.  数据库

1.安装MS SQL Server2000,安装的时候注意选择混合模式,sa密码要设置;

2.安装SP4补丁包;

 

2.2.5.  JBoss

1.将压缩包解压到你想安装JBoss的位置;

 

2.2.6.  JDBC

1MS SQL2000 JDBC是需要安装的,安装的时候要选择自定义安装,设定并记录安装的目录;

 

3.  开发

3.1.  项目设计

 

目录结构:

项目

备注

项目名称

Transaction

目录设计

公用代码:/src

EJB/ejb

Web Java代码:/websrc

Web Jsp/WebContext

Ant编译临时目录:/Tmp

库目录:/lib

数据源配置文件目录:/ds

应用程序

名称:Transaction

EJB版本

2.0

J2EE版本

J2EE 1.4

EJB

名称:Ejb2

Bean类型:Stateless

接口:Remote

 

数据库设计

服务器

moshco

服务器类型

MS SQL2000 Server

数据库

Transaction

UserName

描述

测试表

字段

数据类型

长度

ISNULL

描述

Id

int

4

FALSE

记录编号

Name

nvarchar

64

TRUE

姓名

 

 

 

 

 

 

服务器

moshco

服务器类型

MS SQL2000 Server

数据库

Transaction

UUI

描述

测试表

字段

数据类型

长度

ISNULL

描述

Id

int

4

FALSE

记录编号

Name

nvarchar

64

TRUE

姓名

 

 

 

 

 

 

添加数据库记录

Insert into UUI(Id,Name) values(1,'moshco zhu')

 

 

3.2.  开发过程

3.2.1.  创建项目与配置

 

1.新建项目,打开Eclipse开发环境,创建一个J2EE 1.4的项目。如图操作,选择下一步;

2.输入数据项目名称[Transanction]。选择完成;

3.创建完成的项目如下:

 

4.创建目录结构:

如下图所示,逐一创建如下目录:

ds:数据源配置文件目录、

ejbEJB源代码目录、

ejb/META-INFEJB部署配置文件目录、

lib:库文件目录、

META-INF:应用程序部署配置文件目录、

Src:公用源代码目录、

TmpAnt编译临时目录、

Tmp/ear

Tmp/ejb

Tmp/src

Tmp/web

Tmp/websrc

WebContextWeb内容目录、

WebContext/WEB-INF:WEB配置文件目录、

WebContext/WEB-INF/libWEB库文件目录、

websrcWEB源代码目录。

 

 

创建完毕以后目录结构应该如下图:

 

5.配置源代码目录:

在项目[Transaction]上点击右键,选择[属性],在弹出的窗体中选择[Java构建路径],再选择右边的[源代码],点击[添加文件夹(A)…],选择/ejb/src/websrc,点击确定按钮。

设置缺省输出文件夹: /Transaction/WebContext/WEB-INF/classes

最后点击确定。

 

6.配置库lib目录。将安装在MS SQL2000 JDBC目录下的文件[msbase.jarmssqlserver.jarmsutil.jar]拷贝到[/lib]目录下,然后设置它们为库;

 

3.2.2.  开发代码

3.2.2.1.    EJB

 

1.新建SessionBean

设置包:ejbs

名称Ejb2Bean

Ejb类型:Stateless

Ejb接口:Remote

创建哪些方法:全选

最后点击完成。

 

2.创建Ejb接口。分别创建Ejb2Home(实现接口EJBHome)、Ejb2接口(实现接口EJBObject

 

3.Ejb2Home.java中定义方法[Ejb2 create() throws RemoteException, CreateException;],代码如下所示:

Ejb2 create() throws RemoteException, CreateException;

 

4.[src]源代码目录中,创建一个处理事务的DAO[Dao.java],包名[com.mh.dao],实现接口[java.io.Serializable]

 

编写代码如下:

/**

 *

 */

package com.mh.dao;

 

import java.io.Serializable;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

 

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import javax.transaction.UserTransaction;

 

/**

 * @author moshco zhu

 *

 */

public class Dao implements Serializable {

 

  /**

   * @param args

   */

  public static void main(String[] args) {

       // TODO 自动生成方法存根

 

  }

 

  /**

   * @功能:获取数据库连接

   *

   * @return

   */

  public static Connection getConnection() {

 

       // 定义变量

       Context ctx = null;

       DataSource ds = null;

       Connection conn = null;

 

       try {

 

           // 创建环境对象

           ctx = new InitialContext();

 

           // 获取数据源

           ds = (DataSource) ctx.lookup("java:jdbc/MSSQL_XA");

           // 获取数据库连接

           conn = ds.getConnection();

           // 打印提示信息

           if (conn != null && !conn.isClosed()) {

                System.out.println("获取数据库连接[java:jdbc/MSSQL_XA]成功!");

如果你写成[java:comp/env/jdbc/MSSQL_XA]程序会报告[java.sql.SQLException: Table not found in statement [select * from UUI where id = ?]]错误!其根本原因是你没有使用正确的JNDI名称。如果你要找到正确的JNDI到这里

           }

 

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

       }

 

       // 返回函数值

       return conn;

  }

 

  /**

   * @功能:EJB测试函数

   *

   * @return

   */

  public String test() {

 

       // 定义变量

       String strResult = "";

       Context ctx = null;

       Connection conn = null;

       PreparedStatement ps = null;

       String strUserName = "";

       UserTransaction utx = null;

 

       try {

 

           // 创建环境对象

           ctx = new InitialContext();

 

           // 获取Bean事务管理类

           utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");

 

           // 事务开始

           utx.begin();

 

           // 获取数据库连接

           conn = Dao.getConnection();

 

           // 查询用户名称

           ps = conn.prepareStatement("select * from UUI where id = ?");

           ps.setInt(1, 1);

           ResultSet rs = ps.executeQuery();

           while (rs.next()) {

                strUserName = rs.getString("name");

                break;

           }

 

           // 插入2条新的数据

           ps = conn

                     .prepareStatement("insert into username(name) values('hede2')");

           ps.executeUpdate();

           ps = conn.prepareStatement("insert into UUI(name) values('hede1')");

           ps.executeUpdate();

 

           // 提交事务

           utx.commit();

 

       } catch (Exception e) {

           e.printStackTrace();

           try {

                utx.rollback();

           } catch (Exception e1) {

                e1.printStackTrace();

           }

       } finally {

           strResult = "Hello," + strUserName;

           if (conn != null) {

                try {

                     conn.close();

                } catch (Exception e) {

                     e.printStackTrace();

                }

                conn = null;

           }

       }

 

       // 返回函数值

       return strResult;

  }

 

}

 

5.[Ejb2Bean.java]中添加方法[public String sayHello() throws RemoteException],代码如下:

/**

 * @功能:业务功能:测试函数

 *

 * @return

 * @throws RemoteException

 */

public String sayHello() throws RemoteException {

 

     // 创建事务DAO对象,实现事务方法

     String strResult = (new Dao()).test();

     // 返回函数值

     return strResult;

}

 

6.[Ejb2.java]中添加方法[public String sayHello() throws RemoteException;]定义,代码如下:

public String sayHello() throws RemoteException;

 

7.在目录[/ejb/META-INF]中创建部署描述文件[ejb-jar.xml][jboss.xml],内容如下:

 

ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'ejb-jar_2_0.dtd'>

<!-- http://java.sun.com/dtd/ejb-jar_2_0.dtd  http://localhost:8080/haiejb/WEB-INF/-->

<ejb-jar>

    <description>Ejb2</description>

    <display-name>EJB Transaction</display-name>

    <enterprise-beans>

        <session>

            <ejb-name>Ejb2</ejb-name>

            <home>ejbs.Ejb2Home</home>

            <remote>ejbs.Ejb2</remote>

            <ejb-class>ejbs.Ejb2Bean</ejb-class>

            <session-type>Stateless</session-type>

            <transaction-type>Bean</transaction-type>

 

            <resource-ref>

                <description></description>

                <res-ref-name>jdbc/MSSQL_XA</res-ref-name>

                <res-type>javax.sql.DataSource</res-type>

                <res-auth>Container</res-auth>

            </resource-ref>

 

        </session>

    </enterprise-beans>

</ejb-jar>

 

 

需要注意的是:

[<transaction-type>]的设置一定要是[Bean],否则事务DAO中的方法[test]是没有办法正确执行下面这条语句的:

[utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction")]

 

 

jboss.xml

<?xml version="1.0" encoding="UTF-8"?>

<jboss>

    <enterprise-beans>

        <session>

            <ejb-name>Ejb2</ejb-name>

            <jndi-name>Ejb2</jndi-name>

        </session>

    </enterprise-beans>

</jboss>

 

 

3.2.2.2.    WEB

 

1.[websrc]中创建一个Servlet [SayHello.java]类,源代码如下:

/**

 *

 */

package com.mh.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import ejbs.Ejb2;

import ejbs.Ejb2Home;

 

/**

 * @author moshco zhu

 *

 */

public class SayHello extends HttpServlet {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO 自动生成方法存根

 

    }

 

    public void destroy() {

        // TODO Auto-generated method stub

        super.destroy();

    }

 

    public void init() throws ServletException {

        // TODO Auto-generated method stub

        super.init();

    }

 

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

 

        // 获取输出对象

        request.setCharacterEncoding("UTF-8");

        response.setCharacterEncoding("UTF-8"); // 设置输出编码

        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();

        // 结果值

        String strResult = "Test!";

 

        String message = "nothing!";

        try {

 

            InitialContext ic = new InitialContext();

 

            Object objRef = ic.lookup("Ejb2");// java:comp/env/Ejb2

 

            Ejb2Home home = null;

            try {

                home = (Ejb2Home) PortableRemoteObject.narrow(objRef,

                        Ejb2Home.class);

                if (home != null) {

                    System.out.println("取得Home");

                }

            } catch (Exception e) {

                System.out.println("这里出错了!/n");

                e.printStackTrace();

            }

 

            // 创建EJB对象

            Ejb2 ejb = home.create();

            // 调用业务方法

            message = ejb.sayHello();

 

        } catch (Exception e) {

            e.printStackTrace();

            message = e.toString();

        } finally {

        }

 

        // 输出

        out.print(message + "<br>");

        out.print(strResult);

        out.flush();

        out.close();

    }

 

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}

 

2.配置[web.xml],在路径[/WebContext/WEB-INF]下创建文件[web.xml]

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'web-app_2_3.dtd'>

<!-- http://java.sun.com/dtd/web-app_2_3.dtd http://localhost:8080/haiejb/WEB-INF/  -->

<web-app>

 

    <servlet>

        <servlet-name>SayHello</servlet-name>

        <servlet-class>com.mh.servlet.SayHello</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>SayHello</servlet-name>

        <url-pattern>/sv/SayHello.do</url-pattern>

    </servlet-mapping>

 

    <resource-ref>

        <description></description>

        <res-ref-name>jdbc/MSSQL_XA</res-ref-name>

        <res-type>javax.sql.DataSource</res-type>

        <res-auth>Container</res-auth>

    </resource-ref>

 

    <ejb-ref>

        <ejb-ref-name>Ejb2</ejb-ref-name>

        <ejb-ref-type>Session</ejb-ref-type>

        <home>ejbs.Ejb2Home</home>

        <remote>ejbs.Ejb2</remote>

    </ejb-ref>

 

    <welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

    </welcome-file-list>

</web-app>

 

 

 

3.配置[jboss-web.xml],在路径[/WebContext/WEB-INF]下创建文件[jboss-web.xml]

<?xml version="1.0" encoding="UTF-8"?>

<jboss-web>

 

    <resource-ref>

        <description>Ejb2</description>

        <res-ref-name>jdbc/MSSQL_XA</res-ref-name>

        <jndi-name>jdbc/MSSQL_XA</jndi-name>

    </resource-ref>

 

    <ejb-ref>

        <ejb-ref-name>Ejb2</ejb-ref-name>

        <jndi-name>Ejb2</jndi-name>

    </ejb-ref>

 

 

</jboss-web>

 

 

4.[/WebContext/index.jsp]下创建文件index.jsp,文件内容如下:

<%@ page language="java" contentType="text/html; charset=GB18030"

    pageEncoding="GB18030"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB18030">

<title>Ejb测试</title>

</head>

<body>

 

<p>

<center><a href="/ejb2/sv/SayHello.do" target="_blank">EJB测试</a></center>

</p>

 

 

</body>

</html>

 

 

 

3.2.2.3.    应用程序

 

1.[/META-INF]下创建文件[application.xml],内容如下:

<?xml version="1.0" encoding="UTF-8"?>

 

<application>

    <display-name>Transaction EJB J2EE Application</display-name>

    <module>

        <web>

            <web-uri>ejb2.war</web-uri>

            <context-root>/ejb2</context-root>

        </web>

    </module>

    <module>

        <ejb>ejb2.jar</ejb>

    </module>

</application>

 

 

 

 

3.2.3.  Ant编译

1.创建文件[/build.xml],内容如下:

<?xml version="1.0"  encoding="UTF-8" ?>

 

<!-- 一个项目,可包含很多任务组(target) -->

<project default="main" basedir=".">

 

    <!-- 项目名称 -->

    <property name="prjname" value="ejb2" />

 

    <!-- 临时目录 -->

    <property name="tmp" value="Tmp" />

    <!-- JBoss安装目录 -->

    <property name="jboss.home" value="d:/jboss-4.0.5.GA" />

 

    <!-- JBoss启动服务类型 -->

    <property name="jboss.server" value="all" />

 

    <!-- 路径变量定义 -->

    <property name="jre.home" value="d:/Java/jdk1.5.0_12/jre" />

    <property name="j2ee.classpath" value="D:/Eclipse/Eclipse_3.1.2_JBossIDE_1.6.0/plugins/org.jboss.ide.eclipse.jdt.j2ee.core_1.6.0.GA" />

    <property name="webServices.classpath" value="D:/Eclipse/Eclipse_3.1.2_JBossIDE_1.6.0/plugins/org.jboss.ide.eclipse.jdt.ws.core_1.6.0.GA" />

    <property name="jboss.classpath" value="${jboss.home}/server/${jboss.server}/lib/jboss-j2ee.jar" />

 

    <!-- 编译库 -->

    <path id="classpath">

 

        <!-- JRE -->

        <pathelement location="${jre.home}/lib" />

        <pathelement path="${jre.home}/lib/rt.jar" />

        <pathelement path="${jre.home}/lib/jsse.jar" />

        <pathelement path="${jre.home}/lib/jce.jar" />

        <pathelement path="${jre.home}/lib/charsets.jar" />

        <pathelement path="${jre.home}/lib/ext/dnsns.jar" />

        <pathelement path="${jre.home}/lib/ext/localedata.jar" />

        <pathelement path="${jre.home}/lib/ext/sunjce_provider.jar" />

        <pathelement path="${jre.home}/lib/ext/sunpkcs11.jar" />

 

        <!-- J2EE -->

        <pathelement location="${j2ee.classpath}/lib/j2ee-1.4" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/ejb-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jacc-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jca-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jms-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jsp-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/jta-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/servlet-api.jar" />

        <pathelement path="${j2ee.classpath}/lib/j2ee-1.4/sql-api.jar" />

 

        <!-- Web Services -->

        <pathelement location="${webServices.classpath}/lib/wsi-1.0" />

        <pathelement path="${webServices.classpath}/lib/wsi-1.0/jaxr-api.jar" />

        <pathelement path="${webServices.classpath}/lib/wsi-1.0/jaxrpc-api.jar" />

        <pathelement path="${webServices.classpath}/lib/wsi-1.0/saaj-api.jar" />

        <pathelement path="${webServices.classpath}/lib/wsi-1.0/xml-api.jar" />

 

        <!-- Lib -->

        <pathelement location="lib" />

        <pathelement path="lib/jtds-1.2.2.jar" />

        <pathelement path="lib/msbase.jar" />

        <pathelement path="lib/mssqlserver.jar" />

        <pathelement path="lib/msutil.jar" />

 

        <!-- EJB -->

        <pathelement path="${tmp}/ejb/${prjname}.jar" />

 

    </path>

 

    <!-- EJB -->

    <target name="ejb">

        <delete dir="${tmp}/ejb" />

        <mkdir dir="${tmp}/ejb" />

        <javac srcdir="src" destdir="${tmp}/ejb">

            <classpath refid="classpath" />

        </javac>

        <javac srcdir="ejb" destdir="${tmp}/ejb">

            <classpath refid="classpath" />

        </javac>

        <copy todir="${tmp}/ejb/META-INF">

            <fileset dir="ejb/META-INF" />

        </copy>

        <jar basedir="${tmp}/ejb" jarfile="${tmp}/ejb/${prjname}.jar" />

    </target>

 


    <!-- WEB -->

    <target name="web" depends="ejb">

        <delete dir="${tmp}/web" />

        <mkdir dir="${tmp}/web" />

        <delete dir="${tmp}/websrc" />

        <mkdir dir="${tmp}/websrc" />

        <!-- 编译 -->

        <javac srcdir="websrc" destdir="${tmp}/websrc">

            <classpath refid="classpath" />

        </javac>

这里特别要注意:如果带了这段,程序会报告错误这里

        <!--

            <copy todir="${tmp}/web/WEB-INF/lib">

            <fileset file="${tmp}/ejb/${prjname}.jar" />

            </copy>

        -->

        <copy todir="${tmp}/web">

            <fileset dir="WebContext/" />

        </copy>

        <delete dir="${tmp}/web/WEB-INF/classes" />

        <jar basedir="${tmp}/websrc" jarfile="${tmp}/web/WEB-INF/lib/websrc.jar" />

        <copy todir="${tmp}/web/WEB-INF/lib">

            <fileset dir="lib" />

        </copy>

        <jar basedir="${tmp}/web" jarfile="${tmp}/web/${prjname}.war" />

    </target>

 

    <!-- EAR -->

    <target name="main" depends="web">

        <delete file="${prjname}.ear" />

        <delete dir="${tmp}/ear" />

        <mkdir dir="${tmp}/ear" />

        <copy todir="${tmp}/ear">

            <fileset file="${tmp}/web/${prjname}.war" />

            <fileset file="${tmp}/ejb/${prjname}.jar" />

        </copy>

        <copy todir="${tmp}/ear/META-INF">

            <fileset dir="META-INF" />

        </copy>

        <jar basedir="${tmp}/ear" jarfile="${prjname}.ear" />

        <!-- 发布 -->

        <copy todir="${jboss.home}/server/${jboss.server}/lib">

            <fileset dir="lib" />

        </copy>

        <copy todir="${jboss.home}/server/${jboss.server}/deploy">

            <fileset dir="ds" />

            <fileset file="${prjname}.ear" />

        </copy>

    </target>

 

</project>

 

2.编写脚本[/ant.bat],内容如下:

F:

cd F:/Epd/Eclipse/eclipse_3.1.2+JBoss IDE 1.6.0.GA/Transaction

%ANT_HOME%/bin/ant -file build.xml

pause

 

3.编译运行,在文件[ant.bat]上点击右键,选择[打开方式]->[缺省编辑器]

 

或者这样:在[build.xml]上点击右键,选择[运行方式]->[Ant构建],结果如下图:

 

 

 

3.2.4.  配置数据源

因为我们使用的是JTA,因此我们需要配置XA的数据库源;

 

1.打开数据库和服务器分布式服务;见这里

2.JBoss安装目录下的目录[docs/examples/jca]下拷贝文件[mssql-xa-ds.xml]到目录[/ds]

3.打开编辑文件[mssql-xa-ds.xml],内容如下:

<?xml version="1.0" encoding="UTF-8"?>

 

<!-- ===================================================================== -->

<!--                                                                       -->

<!--  JBoss Server Configuration                                           -->

<!--                                                                       -->

<!-- ===================================================================== -->

 

<!-- $Id: mssql-xa-ds.xml 23720 2004-09-15 14:37:40Z loubyansky $ -->

<!-- ==================================================================== -->

<!-- ConnectionManager setup for xa Microsoft SQL Server 2000, using      -->

<!-- Microsoft's JDBC driver.                                             -->

<!-- Thanks to Benjamin Geer  <benjamin.geer@misys.com>                   -->

<!-- Be sure to set the JndiName property to the name you want to look up -->

<!-- the datasource under and set the location of your database in        -->

<!-- the xa-datasource-property section.                                  -->

<!-- ==================================================================== -->

 

<datasources>

    <xa-datasource>

        <jndi-name>jdbc/MSSQL_XA</jndi-name>

        <track-connection-by-tx />

        <isSameRM-override-value>false</isSameRM-override-value>

        <xa-datasource-class>com.microsoft.jdbcx.sqlserver.SQLServerDataSource</xa-datasource-class>

        <xa-datasource-property name="ServerName">moshco</xa-datasource-property>

        <xa-datasource-property name="DatabaseName">Transaction</xa-datasource-property>

        <xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>

        <!-- not sure if these should be here-->

        <user-name>sa</user-name>

        <password>sa12</password>

 

        <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->

        <metadata>

            <type-mapping>MS SQLSERVER2000</type-mapping>

        </metadata>

    </xa-datasource>

 

</datasources>

 

 

注意:

如果你配置的不是XA数据源,你需要拷贝的是[mssql-ds.xml],如果你想在一次事务中实现多个SQL操作,你需要在配置文件中做如下的配置,与一般不同的是,Url的配置多了一段[electMethod=cursor;],这个非常重要,否则会报告[Can't start a cloned connection while in manual transaction mode]错误。

<?xml version="1.0" encoding="UTF-8"?>

 

<!-- ===================================================================== -->

<!--                                                                       -->

<!--  JBoss Server Configuration                                           -->

<!--                                                                       -->

<!-- ===================================================================== -->

 

<!-- $Id: mssql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ -->

 

  <!-- ======================================================================-->

  <!-- New ConnectionManager setup for Microsoft SQL Server 2000  driver     -->

  <!-- You may download the latest Microsoft JDBC driver from *Microsoft*    -->

  <!-- http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/001/779/msdncompositedoc.xml&frame=true -->

  <!-- ===================================================================== -->

 

<datasources>

  <local-tx-datasource>

    <jndi-name>jdbc/MSSQL</jndi-name>

    <connection-url>jdbc:microsoft:sqlserver://moshco:1433;DatabaseName=Transaction;SelectMethod=cursor;</connection-url>

    <driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class>

    <user-name>sa</user-name>

    <password>sa12</password>

        <!-- sql to call when connection is created

        <new-connection-sql>some arbitrary sql</new-connection-sql>

        -->

 

        <!-- sql to call on an existing pooled connection when it is obtained from pool

        <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>

        -->

 

      <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->

      <metadata>

         <type-mapping>MS SQLSERVER2000</type-mapping>

      </metadata>

  </local-tx-datasource>

 

</datasources>

 

 

 

3.2.5.  发布运行

 

1. 打开Jboss服务器视图:[窗体]->[显示视图]->[其它],然后选择[Jboss-IDE]->[Server Navigator],点击确定。

 

2. 在视图中点击右键,选择[Configuration…],选择[Jboss 4.0.x],点击[新建],输入名称[JBoss 4.0.5.GA],设置Jboss的安装目录[D:/jboss-4.0.5.GA],选择服务器配置[all],点击[应用],点击关闭;

 

3. 运行[/ant.bat]

4. 在服务器视图中选择,刚才设置的服务器,点击右键,选择[start],如果弹出Window防火墙的窗体,选择解除阻止;

这里需要说明一下:它表示你配置的数据源[jdbc/MSSQL_XA]被绑定到了[java:jdbc/MSSQL_XA],所以在引用的时候不能写成[java:comp/env/jdbc/MSSQL]

 

 

3.3.  备注

 

 

4.  配置调试

如果你的程序在调试时出现下面的错误,你需要删除[WEB-INF/lib]下的EJB Jar包,或者在发布的时候就不要将Jar包拷贝到[WEB-INF/lib]。这个问题很奇怪,不知道JBoss怎么会出这样的错误!

java.lang.ClassCastException at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)

 

 

5.  成功

 

1. 在浏览器中打开连接[http://localhost:8080/ejb2/],点击[测试EJB];正确的结果如下图:

2. 可能有人会问,从哪里可以验证我们使用的JTA正确运行了呢?你可以打开[MS SQL2000[企业管理器]],你会发现数据库中已经多了几条记录。

 

 

 

 

6.  经验之谈

1.不要疲劳状态下开发(如果累了,就喝杯咖啡,休息一下。);

2.要善于使用网络资源(www.baidu.comwww.google.cn......)

3.迂回战术(先解决能够解决的);

4.不要放弃(不要轻易说自己搞不定);

5.不要急躁(不要怨天尤人)。

 

7.  备注

7.1.  打开数据库和服务器的分布式服务

MS SQL2000 Server默认情况下,是不会启动分布式服务的,需要我们进行一些设置,设置步骤如下:

1.安装补丁;

首先将MS SQL2000 JDBC安装目录下的文件[/SQLServer JTA/sqljdbc.dll]拷贝到目录[/MSSQL/Binn]下。

打开SQL查询分析器,打开MS SQL2000 JDBC安装目录下的文件[/SQLServer JTA/instjdbc.sql],选中所有的SQL代码,点击执行。

做完这步,需要从新启动数据库服务。

 

 

如果你的程序报告错误[未能找到存储过程 'master..xp_jdbc_open'],其原因就是因为你没有安装这个补丁。

 

2.配置服务器MSDTC服务;

打开[控制面板]->[管理工具]->[组件服务],选中[控制台根目录]->[组件服务]->[计算机]->[我的电脑],点击右键,选择[属性],选择[MSDTC]->[安全性配置],选择[网络DTC]访问,选择[启用XA事务],确认[DTC]登录帐号是:[NT AUTHORITY/NetworkService],然后确定。

如果你的JBoss服务器已经启动,做完这一步,你需要从新启动的JBoss服务。

 

如果你的程序报告下面的错误,其原因,就是因为你没有配置服务器的MSDTC服务。

[JBossManagedConnectionPool] Throwable while attempting to get a new connection: null

org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.)

 

 

3.启动数据库DTC服务;

打开[企业管理器],在数据库目录下选择[支持服务]->[分布式事务处理协调器],点击右键选择[启动]

 

如果你的程序报告错误如下,其原因就是因为你没有打开这项服务。

Throwable while attempting to get a new connection: null

org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]xa_open (0) returns -3)

或者是:

Could not create connection; - nested throwable: (java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Failed to initialize DTC. Check if DTC service is running.)

 

 

7.2.  查找JNDI

 

查找JNDI

如果要查明自己获取资源JNDI的正确写法,可以打开如下连接[http://localhost:8080/jmx-console/],如果要求输入用户名和密码,你可以在JBoss安装目录的[server/all/conf/props/ jmx-console-users.properties]中找到,默认是:[admin/admin]。在打开的视图中选择[jboss]->[ service=JNDIView]

这里

 

进入程序,到[list]方法,点击下面的按钮[Invoke]

这里

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 

Eclipse+Jboos开发JTA实战经验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值