EJB的环境

项目中一直都在使用EJB(无状态SessionBean),但由于EJB在项目中主要起到分布式作用,因此,都是非常简单的应用,对EJB的环境配置、事务等功能都未曾细研,在此转自http://infocenter.apusic.com/help/index.jsp?topic=/aas/v6/ejb_env.html 上的文章,以备查阅!

摘要

本节提供对Apusic应用服务器中的EJB环境的介绍,包括作为EJB环境的JNDI命名上下文(Context)的介绍、如何使用EJB的环境项(environment entry)、如何在EJB环境中设置对资源连接创建器的引用、如何在EJB环境中设置对应用服务器中被管理对象的引用,最后是存在于应用服务器命名环境中、可访问的javax.transaction.UserTransaction接口的介绍。

46.10.1. 概述

EJB组件编程模型提供了一个将企业应用业务逻辑的开发和部署分开的灵活模型。通常在企业应用开发、部署和运行过程中,随着业务需求的不断变化,应用的业务逻辑也在随之发生变化,另外,为提高EJB的可重用特性,需要一种标准的方式,将组件逻辑与实际生产环境中需要访问的其他资源的具体信息分离,因此,EJB编程模型中,引入了EJB环境。

EJB环境实际上是伴随EJB的一个运行时由容器负责管理的JNDI命名上下文,其内容来自于开发者在部署描述中设置和声明的信息。通常,对于业务逻辑中易发生变化的内容,以及组件中需要访问的实际生产环境中的资源(如数据库、邮件服务等)信息,开发者可以将其从组件代码中分离出来,放置到EJB环境有关的部署描述中,这样,在运行时,可只以通过修改部署描述来修改应用的业务逻辑并使组件适应新的部署环境。

EJB环境中提供对如下内容的设置和定制:

  • 使用环境项(environment entry)进行一般的业务逻辑定制 ;

  • 定制对其它EJB组件的引用;

  • 通过资源管理器的连接创建器引用(resouce manager connection factory reference)指定资源管理器的连接创建器;

  • 使用资源环境引用定义伴随某资源的被管理对象接口;

当组件被部署到应用服务器,容器将对部署描述中有关EJB环境设置的内容进行管理,并将其绑定到一个容器管理的命名上下文(naming context)上,组件代码中通过JNDI API访问EJB环境中定义的内容。

需要注意的是,对于不同的EJB组件,其部署描述中定义的环境项(environment entry)集合是不能共享的;只有同一个EJB组件的所有实例,才能共享相同的环境项集合。另外,在EJB规范中规定,在运行时,实例只能对环境项的进行只读操作,不能试图修改环境项。

如果同一个EJB组件被多次部署到容器中,则每一次部署都会被视为不同的组件而生成不同的Home实例,并对不同的Home实例伴随不同的环境项集合,只有属于同一个Home实例的EJB实例,才共享相同的环境项集合。

46.10.2. 环境项(environment entry)

EJB组件模型中的环境项,提供了在装配和部署时,通过修改部署描述,改变组件业务逻辑的方法。

46.10.2.1. 访问环境项

当组件被部署到应用服务器时,容器将把组件部署描述中设置和声明的环境项保存到EJB环境中的一个名为“java:comp/env的”JNDI命名上下文中,包括此命名上下文直接或非直接的子上下文。在运行时组件可通过JNDI API对这些环境项进行访问。环境项的类型则由开发者在部署描述中声明。下面是在EJB组件业务方法中访问环境项的范例:

public class EmployeeServiceEJB implements SessionBean {
    ...
    public void setTaxInfo(int numberOfExemptions, ...)
        throws InvalidNumberOfExemptionsException {

        ...
        // Obtain the enterprise bean’s environment naming context.
        Context initCtx = new InitialContext();
        Context myEnv = (Context)initCtx.lookup("java:comp/env");

        // Obtain the maximum number of tax exemptions
        // configured by the Deployer.
        Integer max = (Integer)myEnv.lookup(“maxExemptions”);

        // Obtain the minimum number of tax exemptions
        // configured by the Deployer.
        Integer min = (Integer)myEnv.lookup(“minExemptions”);

        // Use the environment entries to customize business logic.
        if (numberOfExeptions > Integer.intValue(max) ||
            numberOfExemptions < Integer.intValue(min))
                throw new InvalidNumberOfExemptionsException();

        // Get some more environment entries. These environment
        // entries are stored in subcontexts.
        String val1 = (String)myEnv.lookup(“foo/name1”);
        Boolean val2 = (Boolean)myEnv.lookup(“foo/bar/name2”);

        // The enterprise bean can also lookup using full pathnames.
        Integer val3 = (Integer)
        initCtx.lookup("java:comp/env/name3");
        Integer val4 = (Integer)
        initCtx.lookup("java:comp/env/foo/name4");
        ...
    }
}

 

46.10.2.2. 设置环境项

对EJB代码中访问的环境项,需要在部署描述文件中使用env-entry元素进行声明,每个env-entry元素代表EJB环境中的一个环境项。env-entry元素的结构如下图:

env-entry元素结构



 

      一个env-entry元素中包含一个可选的描述环境项的子元素description;一个声明相对于java:comp/env命名上下文的环境项名字的元素env-entry-name;声明环境项值的Java类型(即通过JNDI的lookup方法返回的对象类型)的元素env-entry-type;一个表示环境项值的可选元素env-entry-value。

由于在运行时,每个EJB组件的环境项的作用域仅存在于本组件内部,因此,不同EJB组件是访问不到其它组件中定义的环境项的,因此不同的EJB组件采用相同的环境项名字,不会发生冲突。

环境项的值只能是以下几种类型:

  • java.lang.String;;

  • java.lang.Character;

  • java.lang.Integer;

  • java.lang.Boolean;

  • java.lang.Double;

  • java.lang.Byte;

  • java.lang.Short;

  • java.lang.Long;

  • java.lang.Float。

除了java.lang.Character类型的环境项值必须是一个字符之外,每一种类型的环境项值,必须符合对应的Java类型中定义的只接受一个字符串参数的构建器方法,所能接受的字符串参数的格式。

对应上一节中的例子,访问多个环境项的EmployeeServiceEJB,有如下的部署描述文件设置:

<enterprise-beans>
    <session>
        ...
        <ejb-name>EmployeeService</ejb-name>
        <ejb-class>EmployeeServiceEJB</ejb-class>
        ...
        <env-entry>
            <description>
                The maximum number of tax exemptions
                allowed to be set.
            </description>
            <env-entry-name>maxExemptions</env-entry-name>
            <env-entry-type>java.lang.Integer</env-entry-type>
            <env-entry-value>15</env-entry-value>
        </env-entry>
        <env-entry>
            <description>
                The minimum number of tax exemptions
                allowed to be set.
            </description>
            <env-entry-name>minExemptions</env-entry-name>
            <env-entry-type>java.lang.Integer</env-entry-type>
            <env-entry-value>1</env-entry-value>
        </env-entry>
        <env-entry>
            <env-entry-name>foo/name1</env-entry-name>
            <env-entry-type>java.lang.String</env-entry-type>
            <env-entry-value>value1</env-entry-value>
        </env-entry>
        <env-entry>
            <env-entry-name>foo/bar/name2</env-entry-name>
            <env-entry-type>java.lang.Boolean</env-entry-type>
            <env-entry-value>true</env-entry-value>
        </env-entry>
        <env-entry>
            <description>Some description.</description>
            <env-entry-name>name3</env-entry-name>
            <env-entry-type>java.lang.Integer</env-entry-type>
        </env-entry>
        <env-entry>
            <env-entry-name>foo/name4</env-entry-name>
            <env-entry-type>java.lang.Integer</env-entry-type>
            <env-entry-value>10</env-entry-value>
        </env-entry>
        ...
    </session>
</enterprise-beans>
...

 

46.10.3. EJB引用

企业应用中,组件之间的相互引用可能会限制单个组件的可移植和可重用特性,在EJB组件的编程模型中,引入了EJB引用。即当某个EJB组件中需要访问应用中的其他EJB时,可以在部署描述中声明对其他EJB的引用,当应用被部署到服务器,由容器解析此引用,并将引用保存在EJB环境中,不需要在组件代码中包含特定的EJB的JNDI名称,这样,当组件被部署到不同的生产环境或被引用的组件发生变化,不需要修改组件代码即可改变EJB的引用目标。

在使用EJB引用时,开发者需要在部署描述中使用ejb-ref元素指定一个到其他EJB的引用项。此引用项包含在EJB环境中,并包含在java:comp/env命名上下文中,根据EJB规范,此引用的命名应在EJB环境中的ejb子上下文中,如:java:comp/env/ejb/RefName,组件代码中即可在EJB环境中使用JNDI的API查找被引用EJB的Home接口。

46.10.3.1. 访问EJB引用

下面是访问EJB引用的代码范例:

public class EmployeeServiceEJB implements SessionBean {
    public void changePhoneNumber(...) {
        ...
        // Obtain the default initial JNDI context.
        Context initCtx = new InitialContext();

        // Look up the home interface of the EmployeeRecord
        // enterprise bean in the environment.
        Object result = initCtx.lookup(
            "java:comp/env/ejb/EmplRecord");

        // Convert the result to the proper type.
        EmployeeRecordHome emplRecordHome = (EmployeeRecordHome)
            javax.rmi.PortableRemoteObject.narrow(result,
            EmployeeRecordHome.class);
        ...
    }
}

 

      上面的例子中,在EmployeeServiceEJB的EJB环境中指定了一个名为ejb/EmplRecord的EJB引用,通过此引用可访问被引用的EJB的Home接口。

46.10.3.2. 声明EJB引用

      尽管EJB引用属于EJB环境中的一个项目,但不可在部署描述中使用env-entry元素对引用进行声明,必须使用ejb-ref或ejb-local-ref元素进行声明,每个ejb-ref或ejb-local-ref代表一个EJB引用。ejb-ref和ejb-local-ref元素的结构如下图:

       ejb-ref和ejb-local-ref元素结构



 

      ejb-ref和ejb-local-ref元素都描述了对其他EJB的引用,所不同的是,ejb-ref声明的是通过远程Home接口和使用远程接口访问被引用的EJB,而ejb-local-ref声明的是通过本地Home接口和使用本地接口访问被引用的EJB。

      ejb-ref和ejb-local-ref都包含一个可选的description元素,用于对此引用提供描述信息;ejb-ref-name元素指定此EJB引用的引用名;ejb-ref-type用于指定引用的EJB组件的类型,可以是“Session”或“Entity”;home、local-home、remote和local元素分别用于指定被引用的EJB组件的远程Home接口、本地Home接口、远程接口和本地接口。

      由于在运行时,每个EJB组件的EJB引用的作用域仅存在于本组件内部,因此,不同EJB组件是访问不到其它组件中定义的EJB引用的,因此不同的EJB组件采用相同的EJB引用名字,不会发生冲突。

      下面是声明EJB引用的部署描述范例:

...
<enterprise-beans>
    <session>
        ...
        <ejb-name>EmployeeService</ejb-name>
        <ejb-class>com.wombat.empl.EmployeeServiceBean</ejb-class>
        ...
        <ejb-ref>
            <description>
                This is a reference to the entity bean that
                encapsulates access to employee records.
            </description>
            <ejb-ref-name>ejb/EmplRecord</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <home>EmployeeRecordHome</home>
            <remote>EmployeeRecord</remote>
        </ejb-ref>
        <ejb-ref>
            <ejb-ref-name>ejb/Payroll</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <home>PayrollHome</home>
            <remote>com.aardvark.payroll.Payroll</remote>
        </ejb-ref>
        <ejb-ref>
            <ejb-ref-name>ejb/PensionPlan</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <home>PensionPlanHome</home>
            <remote>PensionPlan</remote>
        </ejb-ref>
        ...
    </session>
    ...
</enterprise-beans>
...

 

      另外,开发者还需要在apusic-application.xml文件中,对应的EJB组件的设置中,使用ejb-ref或ejb-local-ref元素将引用名与被引用的EJB组件的JNDI名字进行映射。

       apusic-application.xml中的ejb-ref和ejb-local-ref元素的结构如下图:

       ejb-ref和ejb-local-ref元素结构



 

    则上例中的EJB引用的配置在apusic-application中的配置如下:

<apusic-application>
    ...
    <module>
        ...
        <ejb>
            ...
            <session ejb-name="EmployeeService"> 
                ...
                <ejb-ref>
                    <ejb-ref-name>ejb/EmplRecord</ejb-ref-name>
                    <jndi-name>ejb/EmplRecord</jndi-name>
                </ejb-ref>
                <ejb-ref>
                    <ejb-ref-name>ejb/Payroll</ejb-ref-name>
                    <jndi-name>ejb/Payroll</jndi-name>
                </ejb-ref>
                <ejb-ref>
                    <ejb-ref-name>ejb/PensionPlan</ejb-ref-name>
                    <jndi-name>ejb/PensionPlan</jndi-name>
                </ejb-ref>
                ...
            </session>
            ...
        </ejb>
        ...
    </module>
    ...
</apusic-application>

 

46.10.3.2.1. ejb-link

      开发者也可在ejb-jar部署描述中的ejb-ref或ejb-local-ref元素里使用可选的ejb-link元素来将ejb引用连接到具体的EJB组件。ejb-link元素的值必须是被引用的EJB组件的名字,即被引用的EJB组件的部署描述元素ejb-name的值。被引用的EJB组件可以是同一个应用中,与声明引用的EJB组件相同或不同的EJB模块中的EJB组件。

      为了避免整个应用中在发生引用时所产生的EJB名称冲突,ejb-link元素的值必须遵循如下规则,即当被引用的EJB组件位于应用中的其他EJB模块,则在被引用的EJB组件的名字前必须加上被引用组件位于的EJB模块的模块路径,在被引用模块路径和被引用组件名之间使用“#”字符进行分隔。被引用模块路径是相对于当前的引用模块的路径。

如下例:

<enterprise-beans>
    <session>
        ...
        <ejb-name>EmployeeService</ejb-name>
        <ejb-class>com.wombat.empl.EmployeeServiceEJB</ejb-class>
        ...
        <ejb-ref>
            <ejb-ref-name>ejb/EmplRecord</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <home>com.wombat.empl.EmployeeRecordHome</home>
            <remote>com.wombat.empl.EmployeeRecord</remote>
            <ejb-link>EmployeeRecord</ejb-link>
        </ejb-ref>
        ...
    </session>
    ...
    <entity>
        <ejb-name>EmployeeRecord</ejb-name>
        <home>com.wombat.empl.EmployeeRecordHome</home>
        <remote>com.wombat.empl.EmployeeRecord</remote>
        ...
    </entity>
    ...
</enterprise-beans>
...

 

    下例是引用同一个应用中不同模块的EJB组件时,ejb-link的用法:

<entity>
    ...
    <ejb-name>OrderEJB</ejb-name>
    <ejb-class>com.wombat.orders.OrderEJB</ejb-class>
    ...
    <ejb-ref>
        <ejb-ref-name>ejb/Product</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <home>com.acme.orders.ProductHome</home>
        <remote>com.acme.orders.Product</remote>
        <ejb-link>../products/product.jar#ProductEJB</ejb-link>
    </ejb-ref>
    ...
</entity>

 

 注意

当在ejb-jar模块部署描述中的ejb-ref或ejb-local-ref元素里使用了ejb-link元素将EJB引用连接到了具体的EJB组件,则在apusic-application部署描述可以不使用ejb-ref或ejb-local-ref元素将引用名与被引用EJB组件的JNDI名进行映射。

46.10.4. 资源管理器的连接创建器引用(resource manager connection factory reference)

Java EE平台中定义了三种可管理资源,JMS消息系统、可通过JDBC连接的数据库系统以及符合Java Connector Architecture规范的后端系统,应用可通过以上资源的连接创建器(Connection Factory)创建对以上资源的连接。应用服务器则对以上资源提供资源管理器,对应用中创建的资源连接进行管理,如对资源连接提供连接池、在事务中自动对连接进行征用(enlist)等。

Apusic应用服务器中提供对以上内容的实现,例如当应用通过javax.sql.DataSource接口从连接池中获取java.sql.Connection连接时,应用服务器中的资源管理器即对连接进行管理,不过,这些工作对于应用而言则是透明的,应用只根据接口提供的标准API对连接进行操作即可。

EJB组件中,不可避免将会使用某些资源,但是,实际生产环境中的资源情况是不同的,尤其是当EJB组件被装配到不同的生产环境的时候,因此,EJB组件模型在EJB环境中提供了资源管理器的连接创建器引用的机制,即应用中的代码通过资源连接创建器的逻辑名称,取得资源连接创建器对象,然后通过此对象创建与资源的连接。这样,当应用被部署到不同的生产环境,通过将逻辑名称映射到不同的资源,即可提高应用或组件的可重用特性,不用修改代码即可适应新的生产环境。

46.10.4.1. 使用资源管理器的连接创建器引用

连接创建器的引用必须在EJB组件的部署描述中进行声明,引用是作为EJB环境中的一个特殊项而被声明的,根据EJB规范,推荐开发者所声明的引用位于不同的EJB环境中的子上下文(subcontext)中,如有关数据库连接的创建器引用名应位于java:comp/env/jdbc的子上下文中、有关JMS消息系统的连接创建器引用名应位于java:comp/env/jms的子上下文中、有关JavaMail的连接创建器引用名应位于java:comp/env/mail的子上下文中、有关URL连接创建器引用名应位于java:comp/env/url的子上下文中。

在部署描述中声明了连接创建器引用后,必须在部署描述中将引用映射到实际的资源,这个工作需要在apusic-application.xml中使用相应的部署描述元素将引用名与资源的JNDI名进行映射。

在完成了引用名与实际资源的映射后,组件在运行时即可通过JNDI的API对引用进行查找,然后通过连接创建器创建与特定资源的连接。

46.10.4.2. 声明连接创建器引用

      虽然连接创建器引用作为EJB环境的一部分,但是连接创建器的引用在ejb-jar中使用resource-ref元素声明每一个引用,而不是使用env-entry元素。

      resource-ref元素的结构如下图:

      resource-ref元素结构



 

      EJB组件部署描述中的每个resource-ref元素声明一个连接创建器的引用,包含一个可选的用于对此引用提供文档信息的description元素;包含一个必需的声明引用名的res-ref-name元素、一个声明引用类型的res-ref元素、一个声明引用身份鉴定方式的res-auth元素和一个可选的引用共享范围的res-sharing-scope元素。

      res-ref-name元素的值是EJB代码中使用的引用名称,相对于java:comp/env上下文,如值为jdbc/EmployeeAppDB的引用,实际上被视为java:comp/env/jdbc/EmployeeAppDB上下文。

      res-type元素的值是引用的资源连接创建器的Java类型,如javax.sql.DataSource。

      res-auth-type元素的值用于指定是否在EJB代码中包含登录资源的身份鉴定信息或是按照部署描述中的安全信息通过容器登录资源,如通过代码则值必须是Application,如通过容器则值必须是Container。

      res-sharing-scope元素的值用于指定通过连接创建器引用创建的连接是否可以共享。其值可以是Shareable或是Unshareable,如未指定res-sharing-scope元素,则容器按照值为Shareble的情况进行处理。

      由于在运行时,每个EJB组件的连接创建器引用的作用域仅存在于本组件内部,因此,不同EJB组件是访问不到其它组件中定义的连接创建器引用的,因此不同的EJB组件采用相同的连接创建器引用名字,不会发生冲突。

      下面是EJB组件中声明连接创建器的部署描述文件的例子:

...
<enterprise-beans>
    <session>
        ...
        <ejb-name>EmployeeService</ejb-name>
        <ejb-class>EmployeeServiceEJB</ejb-class>
        ...
        <resource-ref>
            <description>
                A data source for the database in which
                the EmployeeService enterprise bean will
                record a log of all transactions.
            </description>
            <res-ref-name>jdbc/EmployeeAppDB</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>
        ...
    </session>
</enterprise-beans>
...

 

      下面是声明一个JMS消息系统连接创建器引用的例子:

...
<enterprise-beans>
    <session>
        ...
        <resource-ref>
            <description>
                A queue connection factory used by the
                MySession enterprise bean to send
                notifications.
            </description>
            <res-ref-name>jms/qConnFactory</res-ref-name>
            <res-type>javax.jms.QueueConnectionFactory</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Unshareable</res-sharing-scope>
        </resource-ref>
        ...
    </session>
</enterprise-beans>
...

 

46.10.4.3. 引用的映射

      对连接创建器引用的映射需要在apusic-application部署描述中使用resource-ref元素进行定义。

      apusic-application部署描述中resource-ref元素的结构如下:

      resource-ref元素结构



 

      开发者需要将EJB组件中使用res-ref-name元素定义的引用名与实际的资源连接创建器的JNDI名进行映射。如上节中的例子,对应的apusic-application.xml部署描述文件有如下内容:

<apusic-application>
    ...
    <module>
        ...
        <ejb>
            ...
            <session ejb-name="EmployeeService"> 
                ...
                <resource-ref>
                    <res-ref-name>jdbc/EmployeeAppDB</res-ref-name>
                    <jndi-name>jdbc/ConcreteDataSource</jndi-name>
                </resource-ref>
                ...
            </session>
            ...
        </ejb>
        ...
    </module>
    ...
</apusic-application>

 

46.10.4.4. 访问引用

下面的例子演示如何在EJB组件代码中使用上面两节中定义的数据库连接的连接创建器创建JDBC连接:

public class EmployeeServiceBean implements SessionBean {
    EJBContext ejbContext;

    public void changePhoneNumber(...) {
        ...
        // obtain the initial JNDI context
        Context initCtx = new InitialContext();

        // perform JNDI lookup to obtain resource manager
        // connection factory
        javax.sql.DataSource ds = (javax.sql.DataSource)
        initCtx.lookup("java:comp/env/jdbc/EmployeeAppDB");

        // Invoke factory to obtain a connection. The security
        // principal is not given, and therefore
        // it will be defined in related deployment descriptor.
        java.sql.Connection con = ds.getConnection();
        ...
    }
}

 

46.10.4.5. 标准的连接创建器类型

可在连接创建器引用声明中出现的连接创建器引用包括如下类型:

  • JDBC

    javax.sql.DataSource

     

  • JMS消息系统

    javax.jms.QueueConnectionFactory

     

    javax.jms.TopicConnectionFactory

     

  • Java Mail

    javax.mail.Session

     

  • URL

    java.net.URL

     

46.10.5. 资源环境引用(resource environment references)

      在EJB编程模型中,组件可通过某资源的被管理对象(如JMS消息服务中的队列或主题)的逻辑名字,进而取得对此被管理对象的引用。这一类逻辑名字,称为资源环境引用,属于EJB环境的一个组成部分。资源环境引用在EJB组件的部署描述中声明,通过这类引用,EJB组件即可适应不同的实际运行环境。

46.10.5.1. 声明资源环境引用

      资源环境引用属于EJB环境项中的一个特殊组成部分,不通过env-entry元素进行声明,必须在ejb-jar中组件相关的部署描述的resource-env-ref元素进行声明;在部署到实际生产环境之前,还必须在apusic-application中组件相关的部署描述中使用resource-env-ref元素将引用与实际的被管理对象进行映射。

      下图是ejb-jar中resource-env-ref元素的结构:

      resource-env-ref元素结构



 

      在ejb-jar中的resource-env-ref元素,包含一个可选的为此引用提供文档信息的description元素,一个声明引用名称的resource-env-ref-name元素和声明引用对象Java类型的resource-env-ref-type元素。

      resource-env-ref-name是相对于java:comp/env上下文的一个JNDI名字。因此,如果在代码中使用了一个名为java:comp/env/jms/StockQueue的JMS队列的引用,则在resource-env-ref-name中的值应为jms/StockQueue,而不是java:comp/env/jms/StockQueue。

      由于在运行时,每个EJB组件的资源环境引用的作用域仅存在于本组件内部,因此,不同EJB组件是访问不到其它组件中定义的资源环境引用的,因此不同的EJB组件采用相同的资源环境引用名字,不会发生冲突。

      下面是在ejb-jar中声明资源环境引用的例子:

...
<resource-env-ref>
    <description>
        This is a reference to a JMS queue used in the
        processing of Stock info
    </description>
    <resource-env-ref-name>jms/StockInfo</resource-env-ref-name>
    <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
</resource-env-ref>
...

 

      在完成对资源环境引用的声明之后,在部署到实际运行环境之前,开发者还需要将已声明的引用与实际的被管理对象进行映射。映射在整个应用的部署描述文件apusic-application.xml中进行,使用resource-env-ref元素。

       apusic-applicatoin中的resource-env-ref元素结构如下图:

       resource-env-ref元素结构



 

       resource-env-ref元素中,必须包含一个resource-env-ref-name,其值为ejb-jar中对应的resource-env-ref元素中resource-env-ref-name元素的值;还必须包含一个jndi-name元素,此元素的值为被管理对象的JNDI名字。

      上面例子对应的apusic-application中的resource-env-ref元素声明如下:

...
<resource-env-ref>
    <resource-env-ref-name>jms/StockInfo</resource-env-ref-name>
    <jndi-name>jms/StockInfoQueue</jndi-name>
</resource-env-ref>
...

 

   本部署描述片断,将引用jms/StockInfo映射到一个名为jms/StockInfoQueue的JMS消息队列。

46.10.5.2. 访问资源环境引用

      在EJB组件代码中,则可以使用JNDI的API,根据资源环境引用名查找并获取对实际运行环境中被管理对象的引用,如下例:

public class StockServiceBean implements SessionBean {
    public void processStockInfo(...) {
        ...
        // Obtain the default initial JNDI context.
        Context initCtx = new InitialContext();

        // Look up the JMS StockQueue in the environment.
        Object result = initCtx.lookup(
            "java:comp/env/jms/StockQueue");

        // Convert the result to the proper type.
        javax.jms.Queue queue = (javax.jms.Queue)result;
    }
}

 

46.10.6. javax.transaction.UserTransaction接口

      在EJB规范中,Bean管理事务的Session Bean和Message-driven Bean可以通过JNDI API查找“java:comp/UserTransaction”名字,取得对javax.transaction.UserTransaction对象的引用。

      如下例:

public MySessionEJB implements SessionBean {
    ...
    public someMethod(){
        Context initCtx = new InitialContext();
        UserTransaction utx = (UserTransaction)initCtx.lookup(
            “java:comp/UserTransaction”);
        utx.begin();
        ...
        utx.commit();
    }
    ...
}

 

在功能上,上例等价于:
public MySessionEJB implements SessionBean {
    SessionContext ctx;
    ...
    public someMethod(){
        UserTransaction utx = ctx.getUserTransaction();
        utx.begin();
        ...
        utx.commit();
    }
    ...
}
 
中兴OLT配置实战:从零开始,手把手教你完成一个HGU的完整业务开通(含DBA模板、限速与远程升级) 本文详细介绍了中兴OLT配置实战,从零开始手把手教你完成HGU的完整业务开通,包括DBA模板设计、限速与远程升级等关键步骤。通过实际案例和详细命令,帮助工程师快速掌握GPON网络配置技巧,提升运维效率。 阅读详情

相关推荐

3D点云目标检测Complex-YOLO(训练篇)(一)———KITTI数据集预处理与制作

KITTI dataset Download dataset KITTI 3D Object Detection Evaluation 2017 link 下载四个部分,共41.4GB 解压后为四部分内容(相机校准矩阵calib、RGB图像image_2、标签label_2、点云数据velodyne) 对应的testing和training数据。其中,training数据为7481张(图片和点云对应的场景),testing数据 7518张(无label_2数据)。 Data Preprocess

“知识最大的敌人不是无知,而是错觉” 7149

EJB 开发环境与入门实例

环境准备 OS: Windows 8, 64 Bit JDK: 1.8 Eclipse: Photon Release (4.8.0) WildFly: 14.0.1.Final WildFly 介绍 WildFly 是JBoss AS的新的项目的名称。 JBoss分为AS 和 EAP两个版本, AS是开源社区版本,EAP-Enterprise Application Platform是在开源版本...

oscar999的专栏 3125

报错:subprocess.CalledProcessError: Command ‘[‘where‘, ‘cl‘]‘ returned non-zero exit status 1.

右键此电脑--属性--高级系统设置--环境变量--系统变量--找到Path。Enterprise是企业版,如果你是社区版就找Community。2.安装的时候,c++桌面那个需要勾选。

2301_77554343的博客 1506

EJB 知识与运行环境配置

1.1 什么是 Enterprice JavaBeans(EJB) Enterprice JavaBeans 是一个用于分布式业务应用的标准服务端组件模型。采用Enterprice JavaBeans 架构编写的应用是可伸的、事务性的、多用户安全的。可以一次编写这些应用,然后部署在任何支持 Enterprice JavaBeans 规范的服务器平台,如 jboss、weblogic 等。...

iteye_8614的博客 262

告别地图偏移!手把手教你用MapOnline V1.2在ArcGIS里加载无偏谷歌影像和历史影像

本文详细介绍了如何使用MapOnline V1.2插件在ArcGIS中加载无偏谷歌影像和历史影像,解决GIS工程师长期面临的地图偏移问题。通过三步安装配置、无偏影像加载和时空分析功能,提升地理信息数据的精确度和工作效率,特别适用于城市规划、环境监测等场景。

weixin_29252171的博客 232

告别黑窗口!用VSCode+Native Debug调试C/C++程序,比GDB命令行舒服多了

本文介绍了如何使用VSCode配合Native Debug扩展来调试C/C++程序,替代传统的GDB命令行方式。通过可视化调试环境,开发者可以更高效地管理断点、查看变量和调用栈,大幅提升调试效率。文章详细讲解了环境配置、核心调试功能及高级技巧,帮助开发者快速上手这一现代调试工具。

weixin_26833139的博客 249

EJB注入问题

刚学EJB,对于JNDI、annotations、依赖注入问题还是没完全纠结清楚。 服务器是weblogic。 当我发布一个ejb包到服务器上,然后在另一个web项目中一个普通类调用时出现了注入失败,空指针。 比如发布的ejbBean: @Stateless(name = "TestBean") public class TestBean implements TestInf{....}...

zmty123的博客 428

ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

1、符号化显示: CAD数据加载进来有很多列表,包含了点【point】、线【polyline】、面【polygon】、标注数据【Annotation】等数据,本次实验我们需要用到的是面数据,也就是.dwgPolygong格式的数据。如下图所示: 把数据加载进来,然后在2处打开属性表,查看CAD数据的属性表,打开后可以发现【layer】图层表示就是地块的用地性质,它就是符号化显示的依据。 我们在数据上右键【属性】,打开图层属性,找到【符号系统】,选择类别中的【唯一值】,然后在【值字段】下拉选择【layer】,

yuanYW7556的博客 2万+

解读Ejb中Local与Remote项目

在高校平台项目中使用到了Ejb。刚开始的时候,大家都不太懂得Local与Remote的含义、用法以及区别。这里我进行了总结,跟大家分享了一下。 中文翻译过来的意思就很明确了:Local是本地接口;Remote是远程接口。 但是由于Remote接口访问EJB需要经过远程方法调用环节,对性能影响很大,而Local接口访问EJB直接从JVM 中返回EJB的引用。所以使用原则是:要尽量使用Loca

实鼠不疫,牛转乾坤 3936

SAP-ABAP:接口多继承与复合接口设计:复杂业务场景下的能力组合实现方案

本文介绍了ABAP中通过接口多继承与复合接口设计实现能力组合的方案。文章首先辨析了类实现多个接口与接口继承接口的核心概念,指出ABAP虽不支持类多继承,但可通过这两种机制灵活组合能力。随后详细讲解了类实现多个接口的语法规则与三种调用方式,并给出了五个基础能力接口的设计示例(日志记录、权限校验、数据导出、消息通知、格式转换)。作者通过对比单继承与接口多重实现的差异,强调后者在解耦和扩展性上的优势,为复杂业务场景下的能力组合提供了实用解决方案。

baidu_35680696的博客 244

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1912

EJB - 环境设置

一、 本博客将根据官方文档的指导进行EJB环境的设置。 二、系统需求 EJB是Java的一个框架,所以第一个要求是在您的机器上安装一个Java开发工具包(JDK)。 JDK 1.5 or above. Memory no minimum requirement. Disk Space no minimum requirement. Operating Sy...

Alan Zhuang的博客 6547

【WorkBuddy专栏52】Codex与WorkBuddy生态适配、用户争夺与未来走向(下)

【WorkBuddy专栏52】Codex与WorkBuddy在中国大陆的发展——生态适配、用户争夺与未来走向(下)

AI人人懂 676

EJB开发环境配置

前段时间学了点EJB,为了不至于忘了,写一下基本的开发环境配置是必要的,不然每次重装后配置开发环境都是一个痛苦的过程。EJB用NetBean开发挺方便的,目前我也是在NetBean下学习EJB的,所以本篇就用NetBean作为开发工具为例说明配置开发环境的过程。配置开发环境的第一步当然就是把所有要用到的东西都一股脑儿地下载到自己的电脑上,要下载的东西和地址如下所示:1.jdk-6u13

longlongago的博客 1568

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

搭建EJB环境

EJB是一个可重用的、可移植的Java EE组件,一般是存放在EJB容器中。EJB容器就是指EJB组件运行时需要的环境。我这里搭建的EJB环境用到的编译器、IDE、服务器分别如下:JDK6.0、Eclipse For Java EE、JBoss。    1、JDK安装

懂一点信息化 2204

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

EJB 环境配置

 -------------========EJB 环境配置========---------------1. 环境配置1.1 解压缩JBoss服务器解压缩jboss-4.2.2.GA,存放目录:D:/Software/jboss-4.2.2.GA 1.2 解压缩JBoss IDE开发工具解压缩JBossIDE-2.0.0.Beta2-Bundle-win32,存放目录:D:/Software

woaitiyu的专栏 3292

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JBOSS环境下进行EJB开发

<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:w="urn:schemas-microsoft-com:office:word"xmlns="http://www.w3.org/TR/REC-html40">前言 hack hack 1 2 2

JAVA赋--陈松的专栏 1013

EJB3.0初步之环境配置

开发EJB3.0,当然要先配置环境,那我们就来吧!先下载JBoss4.0.3RC2版本,他们说已经包含了EJB3.0的容器,可是我没看到。也罢!我们就先配置一下。如果在这之前版本,肯定是要配置的!1、首先要保证你已经下载了jboss和ejb3.0,先装jboss,这个不用教吧?2、解压缩ejb包,然后坐一下动作:从ejb的lib/目录下把ejb3.deployer 、ejb3-clustered-

Elpout的专栏: .Net or Java ? It's a problem! 2049

EJB环境配置并编写第一个EJB程序

EJB环境配置(jboss-as-7.1.1+jdk1.8+eclipse)并编写第一个EJB程序

RX970924的博客 197

EJB3.X 开发环境搭建 以及第一个EJB项目

参考网址 http://theopentutorials.com/tutorials/java-ee/ejb3/how-to-setup-ejb3-development-environment-eclipse-jboss-7-1/

u011667349的专栏 1289

EJB初学之环境搭建

1.导入EJB容器,配置类似于Tomcat,注意导入的目录中不能包括中文,其它的发布和启动都与tomcat类似。 2.然后检验自己写的EJB Project是否发布成功,检验方法步骤如下。                            下面是关于客户端调用的例子,请看下面图片:

linxiaolv520的专栏 267

Axis环境之下实现web services调用EJB

         在Axis环境之下,实现web services调用EJB1.首先要确保Web Services和EJB都是有效的,可以分别给他们写一个同台机器上的客户端访问一下(本BOLOG上有有关于它们的开发)。   注意:axis要注册相关axis的jar文件,EJB要注册相应的JNDI的jar到环境变量2. 必须把EJB的interface类打包,并注册到服务器所在操作系统的环境变量。3

龙行天下 1897

基于J2EE规范的中间件——EJB开发环境搭建

前言:     前面介绍了关于EJB的一些介绍,今天就先来看看EJB的开发环境如何搭建,有何特点。 正题: 服务器:    EJB的开发使用的服务器不是我们以前的Tomcat,而是JBOSS服务器,两者有何区别呢?    Tomcat 是一个轻量级应用服务器(web服务器,支持部分j2ee),在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选

赵丹丹 廊坊师范学院信息技术提高班 七期 1655

ejb学习, EJB和Spring的比较及EJB3.0的运行环境

今天开始学习ejb,黎活明老师讲的,黎老师是国内ejb方面的权威,《EJB3.0入门经典》就是黎老师写的,EJB领域销量很好的一本书。黎老师讲了ejb的优点,或者说它的侧重点,它和Spring提供的服务很多都是相同的,它主要就是提供分布式服务,Spring是做不到的。分离出了业务层,软件功能改变,只需修改业务层,为后期软件维护提供了方便。业务功能共享。软件实现了最大程度的组件方面的重用。它前景还是...

开发笔记 144

EJB3.0开发环境的搭建

EJB Container的介绍SUN公司正式推出了EJB的规范之后,在众多的公司和开发人员中引起了很大的反响。标志着用Java开发企业级应用系统将变的非常简单。许多公司都已经推出了或正打算EJB的产品。SUN公司对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java 应用系统的跨平台的构件体系结构。采用EJB可以使开发商业应用系统变得容易,应用系统可以在一个支持EJ

xyls_2009的专栏 7466

【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)

之前一直用的EJB开发环境是他们搭建好的,直接拿来用,不过还是感觉老吃别人嚼好的不太好吃,所以自己动手来玩一玩。   EJB开发依赖的最基本的环境:JDK、Eclipse、JBoss,这里简单介绍一下最基本的环境的搭建。 JDK、Eclipse   既然看到这篇文章,说明您对JDK和Eclipse的安装及配置已经烂熟于心,这里不再多说。   需要注意的是,每个版本的JBoss适用的J

点滴汇聚,智在积累。——Danny 5634
上一篇: HTML-META标签详解
下一篇: 多线程编程-interrupt()
javaRwx
博客等级 码龄20年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值