内容


探索 WebSphere Application Server Feature Pack for SCA,第 8 部分

Feature Pack for SCA 中的 Java EE 支持

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 探索 WebSphere Application Server Feature Pack for SCA,第 8 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:探索 WebSphere Application Server Feature Pack for SCA,第 8 部分

敬请期待该系列的后续内容。

简介

Java Platform, Enterprise Edition (Java EE) 使用 Java 编程语言的企业应用程序开发最流行和最广泛采用的标准。尽管 Java EE 规范提供一组丰富的技术,但它缺乏可扩展组件实现技术支持,比如抽象传输和协议程序集的扩展,以及部署超越应用程序边界的组件的技术。因此,它缺乏一些对真正的面向服务架构(SOA)的支持。

IBM WebSphere Application Server Feature Pack for Service Component Architecture (SCA) 将自己的程序集、实现类型、部署、以及服务质量概念扩展到一个 Java EE 应用程序上下文中。这支持将 Java EE 组件用作服务组件实现,并可能使用一些 SCA 工件,比如 服务和属性,这些工件来自一些使用 SCA 注释的 Java EE 模块。另外,它支持将 Enterprise JavaBean™ (EJB) 服务公开为 SCA 服务和重新连接 EJB 引用。

作为 SCA 组件实现的 Java EE 存档

有两个将 Java EE 存档用作 SCA 组件实现的基本场景:

  • 第一个是没有经过 SCA 增强的场景,其中一个 Java EE 存档在一个 SCA 域中可用,供使用其他实现技术的 SCA 组件使用。
  • 第二个是经过 SCA 增强的场景,其中 Java EE 模块能够利用 SCA 的优势,比如重新连接、定义 SCA 属性、定义对域中的其他 SCA 服务的引用、以及使用依赖项注入。

图 1 展示了这两种集成场景类型。

图 1. Java EE 集成场景
展示两个 Java EE 集成场景的图表
展示两个 Java EE 集成场景的图表

没有经过 SCA 增强的场景

表示 Java EE 应用程序并包含一些 Java EE 模块(比如 EJB 和 Web 模块)的 Java EE 存档可用作参与 SCA 复合体的 SCA 组件实现。这个 SCA 功能包支持外部 EAR 贡献,其中 Java EE 存档在那个 SCA 贡献之外打包并部署。

在最简单的场景中,如果您拥有一个名为 HelloJeeEar.ear 的 Java EE 存档和一个带有可部署复合体的名为 HelloJeeSca.jar 的 SCA 贡献包 JAR,则这个 Java EE 存档可以通过如清单 1 所示的语法用作那个 SCA 贡献包中的一个组件实现。

清单 1. 样例 SCA 复合体
<<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://foo" name="HelloJeeScaServiceComposite">

	<component name="HelloJeeComponent">
	    <implementation.jee archive="HelloJeeEar.ear"/>
	</component>

	<component name="MyScaComponent">
	    <implementation.java class=”sca.jee.HelloJeeScaServiceImpl”/>
	    <service name="HelloJeeScaService">
	        <interface.java interface="sca.jee.HelloJeeScaService"/>
	    </service>
	</component>
</composite>

根据 OSOA (Open Service Oriented Architecture) Java EE Integration 规范(参见 参考资料),派生的组件类型将包含以下服务和引用:

  • 带有一个会话 bean bean 的非限定名称 intf 的每个 EJB 3 业务接口都转换为一个名为 bean_intf 的服务。
  • 带有一个会话 bean bean 的名称 ref 的每个 EJB 3 业务接口都转换为一个名为 bean_ref 的服务。

在上面的示例中,如果 HelloJeeEar.ear 包含一个 EJB 模块 HelloJeeEjb.jar,该模块拥有一个带有远程业务接口 HelloJeeSBeanRemote 的会话 bean HelloJeeEjb,则派生的服务的名称将是 HelloJeeEjb_HelloJeeSBeanRemote。派生的服务接口将包含 EJB 业务接口的所有方法。

派生的服务可以在其他 SCA 组件中引用,就像其他任何 SCA 服务一样。注意,有一点很重要:当且仅当服务接口从 bean 的远程服务接口派生出来时,该服务接口才可以远程访问。这样,不需要对实现代码进行任何更改,来自 Java EE 存档的 EJB 服务和 EJB 引用即可成为 SCA 复合体的一部分。

经过 SCA 增强的场景

这个 SCA 功能包不支持将 Java EE 存档用作 SCA 贡献,但支持将这样的存档用作 SCA 贡献中的可部署复合体中的组件实现;这样一个实现是经过 SCA 增强的场景。在这样一个实现中,Java EE 存档必须在它的 META-INF 目录中包含一个名为 application.composite 的可分辨合成文件,如图 2 所示。

图 2. application.composite
一个屏幕截图,展示位于目录树中的 application.composite 文件

当将这样一个 Java EE 存档用作 implementation.jee 指令(directive)中的一个 SCA 组件实现时,SCA 运行时在派生组件类型时自动包含在这样一个复合体中指定的工件。为了将所有 EJB 服务公开为 SCA 服务,或者为了使用 SCA 服务,application.composite 需要使用在相同存档中打包的可部署 EJB 和 Web 模块包含 EJB 的组件或 Web 实现类型。

例如,我们来看一个名为 HelloJeeEnhancedEar.ear 的 Java EE 存档,该存档包含一个名为 HelloJeeEnhancedEjb.jar 的存档,后者又包含一个名为 HelloJeeEnhancedSBean 的无状态会话 bean 和一个名为 HelloJeeEnhancedWeb.war 的 Web 模块。这个存档可能拥有如清单 2 所示的应用程序复合体。

清单 2. application.composite
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:foo="http://foo" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xsi:schemaLocation="http://www.osoa.org/xmlns/sca/1.0 
		http://www.osoa.org/xmlns/sca/1.0"
	name="EnhancedEarComposite"
	targetNamespace="http://foo" autowire="false">
    
  <service name="HelloJeeEnhancedSBean_HelloJeeEnhancedSBeanRemote" 
   promote="EnhancedSbeanComponent/HelloJeeEnhancedSBean_HelloJeeEnhancedSBeanRemote">
    	<binding.sca/>
  </service>
  <reference name="sbean2" promote="EnhancedSbeanComponent/sbean2" 
	target="HelloJeeScaComponent/HelloJeeScaService">
      <interface.java interface="sca.jee.HelloJeeScaService" />
  </reference>

  <property name="propertyejb"   type="xsd:string">EJBIBM</property>
  <property name="propertyweb"  type="xsd:string">WEBIBM</property>
    
  <component name="EnhancedSbeanComponent">
  <implementation.ejb ejb-link="HelloJeeEnhancedEjb.jar#HelloJeeEnhancedSBean"/>
  	<service name="HelloJeeEnhancedSBean_HelloJeeEnhancedSBeanRemote"> 
  		<interface.java interface="sca.jee.HelloJeeEnhancedSBeanRemote" />
  	</service>
  	<reference name="sbean2">
  	    <interface.java interface="sca.jee.HelloJeeScaService" />
  	</reference>
   <property name="propertyejb" type="xsd:string">IBMEJB</property>
  </component>
    
  <component name="EnhancedWebComponent">
    <implementation.web web-uri="HelloJeeEnhancedWeb.war"/>
    <property name="propertyweb"  type="xsd:string">IBMWEB</property>
  </component>
</composite>

在清单 2 中,单个组件指定 SCA 服务和引用。如果应用程序复合体中的组件定义的任一服务和引用需要通过实现这个 Java 存档的组件向 SCA 域公开,它必须从这个应用程序复合体中升级。单独的模块需要的任何属性也必须在这个合成级别上定义。在上面的示例中,名为 propertyweb 的 SCA 属性将在派生的组件中拥有一个 WEBIBM 值,而不是 IBMWEB

application.composite 的使用能够使作为 SCA 服务公开的 EJB 服务重新连接到一些 SCA 兼容绑定,比如 binding.ws 和 binding.jms。将这个 Java EE 存档用作一个 SCA 组件实现的外部 SCA 贡献如清单 3 所示。

清单 3. application.composite 中的一个外部 SCA 贡献
...
  <component name="HelloJeeEnhancedComponent">
    <implementation.jee archive="HelloJeeEnhancedEar.ear"/>
    <service name="HelloJeeEnhancedSBean_HelloJeeEnhancedSBeanRemote"> 
      <interface.java interface="sca.jee.HelloJeeEnhancedSBeanRemote" />
        <binding.ws/>
    </service>
    <reference name="sbean2" target="HelloJeeScaComponent/HelloJeeScaService">
      <interface.java interface="sca.jee.HelloJeeScaService" />
    </reference>
  </component>
...

图 3 展示这些组件如何在一个典型的 Java EE 实现中组合在一起。

图 3. 作为一个 SCA 实现的 Java EE
展示作为一个 SCA 实现的各种 Java EE 组件的图表
展示作为一个 SCA 实现的各种 Java EE 组件的图表

可以通过在运行时使用已定义值注入的注释来在 IJB 和 Web 模块中访问 SCA 引用和属性。清单 4 提供了一个示例。

清单 4. 通过注释访问 SCA 引用和属性
...
import javax.ejb.Stateless;
import org.osoa.sca.annotations.*;
...

@Stateless                                                  // EJB annotation
public class AccountServiceImpl implements AccountService {
@Reference protected Brokerage backend;                     // SCA reference
@Property protected String currency;                        // SCA property
@Context protected SCAContext context;                      // SCA context

public AccountReport getAccountReport(String customerId) {
acctValue BigDecimal = Brokerage.getAccountValue(customerID,“IBM”;
                                                            // use injected reference
  if (currency != “S DOLLARS” {                             // use injected property
  moneyChangerService = context.getService(moneyChanger.class,”oneyExchange”;
                                                            // use injected context
  acctValue = moneyChangerService(current,acctValue);       // invoke SCA service
	}
return backend(customerId, acctValue);
}

通过 application.composite 文件定义 SCA 引用的另一个有趣方面是使用兼容 SCA 引用替换 EJB 引用。只要 SCA 引用接口匹配 EJB 引用接口,SCA 运行时注入将替换那个 EJB。例如,如清单 5 和 6 所示,EJB 引用 sbean2 可由 application.composite 中定义的一个 SCA 引用替换。bean 类包含清单 5 中的注释,application.composite 文件包含清单 6 中的 <reference> 标记。

清单 5. 替换 EJB 引用的注释
@Stateless
public class HelloJeeEnhancedSBean implements HelloJeeEnhancedSBeanRemote,
	HelloJeeEnhancedSBeanLocal {

	@EJB HelloJeeReferencedBeanRemote sbean1;
	@EJB HelloJeeReferencedBeanRemote sbean2;
		//This will be overridden with a SCA reference offering same operation
    /**
清单 6. 替换 EJB 引用的 <reference> 标记
....
  <reference name="sbean2" promote="EnhancedSbeanComponent/sbean2" 
	target="HelloJeeScaComponent/HelloJeeScaService">
      <interface.java interface="sca.jee.HelloJeeScaService" />
  </reference>
....

在上面的示例中,sbean2 的注入值将是 SCA 引用 sbean2 的注入值,而不是相同名称的 EJB 引用。注意,在处理提升的引用时,SCA 将引用视为跨复合体惟一的。因此,您应该注意名称相同的多个 EJB 引用解析为不同的 EJB 模块的情况。

部署

如果您打算将 EJB 服务和引用公开为 SCA 服务和引用,且对自动生成的服务和引用名称感到满意,则您的当前实现不需要任何更改。

但是,如果您想限制公开的服务或想重新连接 EJB 引用和服务,那么 Java EE 存档应该至少拥有一个 application.composite 文件。当 SCA 运行时派生组件类型时,只有在那个合成文件中提升的服务和引用将被使用。如果您希望 Java EE 模块访问 SCA 工件,只有那时才需要更改实现。

对于拥有一个 Java EE 存档的用户来说,WebSphere Application Server 中的组装和部署步骤如下:

  1. 使用一个可部署复合体创建一个新 SCA JAR,该复合体使用 implementation.jee 将 Java EE 存档用作它的组件实现。
  2. 将 Java EE 存档和 SCA JAR 导入为资产。
  3. 创建一个业务级别应用程序(BLA)并将 Java EE 存档和 SCA JAR 作为已部署资产添加到 BLA。顺序很重要:在 SCA 贡献包中用作 SCA 组件实现的所有 Java EE 存档必须在 SCA 贡献包部署之前部署。
  4. 启动 BLA。

安全

Java EE 平台支持授权和安全身份策略。支持安全性 QoS 通过底层 Java EE 容器实施。经过和没有经过 SCA 增强的 Java EE 存档都支持使用授权。implementation.jee 元素引用的 EJBs 授权和安全身份策略通过在 EAR 中的 EJB 部署描述符(ejb-jar.xml)中指定安全约束来实施。这些授权和策略结合绑定上的交互策略来授权对 Java EE 的访问并进行身份验证。为强制实施安全性,需要同时启用管理和应用程序安全性。附加到带有安全性和原样运行(run-as)策略的 implementation.jee 组件的任何 SCA 策略都将被忽略。

事务

implementation.jee 组件中定义的服务的事务支持通过 Java EE 容器处理。服务的事务属性在 EAR 中的 EJB 部署描述符(ejb-jar.xml)中指定。要查看关于 SCA 意图如何映射到 Java EE 事务属性的描述,请参阅 SCA Java EE Integration Specification 5.3 节 “Mapping of EJB Transaction Demarcation to SCA Transaction Policies”(参见 参考资料)。要传播或挂起 implementation.jee 组件中的引用的事务,在合成文件中指定需要的 SCA 事务意图。

结束语

集成 Java EE 和 SCA 有几个好处:

  • EJB 服务可以公开为 SCA 服务,然后以各种连接格式连接。
  • EJB 可以通过使用 SCDL 重新连接,而不必更改底层 Java EE 工件。
  • 可以使用一个 SCA 编程模型来调用 Java EE 组件中的业务服务。
  • 可远程访问的服务可以通过 SCA 默认绑定作为 SCA 服务予以提供,而不必定义 SCDL。
  • 服务可以使用其他实现类型(比如 implementation.java 和 implementation.wsdl)混合。

总之,WebSphere Application Server Feature Pack for SCA 支持 Java EE 程序员和架构师跨越实现技术之间的区别,无需更改实现或只需很少更改即可利用服务组件架构,以便他们在探索 SCA 的同时更轻松地利用现有代码。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=591380
ArticleTitle=探索 WebSphere Application Server Feature Pack for SCA,第 8 部分: Feature Pack for SCA 中的 Java EE 支持
publish-date=11252010