ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SCA客户端以及基于Java的模型实现(五)

SCA客户端以及基于Java的模型实现(五)

原创 Linux操作系统 作者:ITPUB_PMSpace 时间:2008-01-18 10:02:57 0 删除 编辑
Java API。Current Module Context。以下为CurrentModuleContext的Java类

Java API

Current Module Context

  以下为CurrentModuleContext的Java类

package org.osoa.sca;
public final class CurrentModuleContext {
public static ModuleContext getContext() {...}
}

CurrentModuleContext类有下列方法:

getContext() – 返回当前的模块上下文

注意: CurrentModuleContext实现中关于服务提供者的部分会在未来的规范中定义。

Module Context

以下为ModuleContext的Java接口

package org.osoa.sca;
import org.osoa.sca.model.Module;
public interface ModuleContext {
String getName();
String getURI();
Module getMetaData();
RequestContext getRequestContext();
Object locateService(String serviceName);
ServiceReference createServiceReferenceForSession(Object self);
ServiceReference createServiceReferenceForSession(Object self, String
serviceName);
ServiceReference newSession(String serviceName);
ServiceReference newSession(String serviceName, Object sessionID);
}

ModuleContext接口有如下方法:

  • getName() – 返回模块的名字
  • getURI() – 返回模块组件的URI
  • getMetaData() – 返回数据对象的模块元数据。返回的类型的全名是org.osoa.sca.model.Module。接口Module和模型的其他接口都是根据SDO 2.0 [1] XML schema 到 Java 接口映射规则从SCA XML schema中创建的。返回的对象可以强制类型转换成commonj.sdo.DataObject。
  • getRequestContext() – 返回对应调用栈中最后一次远程服务调用所对应的RequestContext对象。本地服务调用不会影响活动的请求上下文。如果从SCA模块之外的代码中调用该方法则会返回null。 locateService() – 返回指定名称的服务的接口实现。该方法的输入是同一SCA模块中的服务的名字。服务的名称可以为以下几种:

/

如果仅定义了一个服务,service-name可以不写

  • createServiceReferenceForSession () – 传入一个服务实现的实例,生成一个可以用于与该实例对话的服务引用。如果组件实现了多个服务,那么就需要传入方法的第二个参数serviceName。
  • newSession() – 以服务的名称作为输入,创建该服务的一个ServiceReference。使用第二个参数以创建一个由应用指定ID的ServiceReference。

Request Context

以下为RequestContext 的Java接口。

package org.osoa.sca;
import java.util.Map;
import javax.security.auth.Subject;
public interface RequestContext {
Subject getSecuritySubject();
String getServiceName();
ServiceReference getServiceReference();
}

RequestContext接口有以下方法:

  • getSecuritySubject() – 返回当前请求的JAAS主题
  • getServiceName() – 返回进来的请求在Java实现上的服务名称。
  • getServiceReference() – 返回请求所调用的服务的引用。可以通过调用一个服务实现上的getServiceReference().getCallback()得到请求所关联回调对象。而在这个服务的引用上调用setCallback()则是不合法的。


ServiceReference

任何实现了ServiceReference接口的对象也可以强制类型转换成该引用对应的服务类型的业务接口。所有远程服务的实现的引用均同时实现了ServiceReference接口和业务接口。

package org.osoa.sca;
public interface ServiceReference {
Object getSessionID();
void endSession();
Object getCallbackID();
void setCallbackID(Object callbackID);
Object getCallback();
void setCallback(Object callback);
}

ServiceReference的Java接口有以下方法:

  • getSessionID() – 返回会话ID
  • endSession() – 结束所引用服务的客户端会话
  • getCallbackID() – 返回回调ID
  • setCallbackID() – 设置回调ID
  • getCallback() – 返回回调对象
  • setCallback() – 设置回调对象

    No Registered Callback Exception

    以下是NoRegisteredCallbackException。

    package org.osoa.sca;
    public class NoRegsiteredCallbackException extends ServiceRuntimeException {

    }

    Service Runtime Exception

    以下是ServiceRuntimeException。

    package org.osoa.sca;
    public class ServiceRuntimeException extends RuntimeException {

    }

    Service Unavailable Exception

    以下是ServiceRuntimeException。

    package org.osoa.sca;
    public class ServiceUnavailableException extends ServiceRuntimeException {

    }

    Session Ended Exception

    以下是SessionEndedException.

    package org.osoa.sca;
    public class SessionEndedException extends ServiceRuntimeException {

    }

    Java标签

    本节为所有SCA相关的Java标签的定义。

    @AllowsPassByReference

    以下是@AllowsPassByReference标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({Type, METHOD})
    @Retention(RUNTIME)
    public @interface AllowsPassByReference {
    }

    @AllowsPassByReference标签是用于远程接口的实现上,用来示意与该服务处于同一模块内的数据交互可以允许传引用的语义。实现保证了参数和返回值是传值的语义即使实际中用的都是传引用的方式。这意味着即使从一个操作返回后,服务也不会修改输入参数和返回值。@AllowsPassByReference annotation标签可以标注在实现远程服务的整个类上,也可以标注在单个的远程服务方法上。

    @AllowsPassByReference
    public class HelloServiceImpl implements HelloService {

    }


    以下为使用@AllowsPassByReference标注Java组件实现类的一个服务方法实现的例子

    @AllowsPassByReference
    public String hello(String message) {

    }


    @Callback

    以下为@Callback标签的类型定义:

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target(TYPE, METHOD, FIELD)
    @Retention(RUNTIME)
    public @interface Scope {
    String value() default null;
    }

    @Callback标签用于标注一个带有回调接口的远程接口,它以该接口的Java的Class对象作为参数。

    @Callback有以下属性:

    value – 用以描述回调接口的Java类文件的名字。

    @Callback标签也可用于标注SCA实现的一个方法或一个字段,用以注入一个回调。

    以下为接口上的一个回调标签:

    @Remotable
    @Callback(MyServiceCallback.class)
    public interface MyService {
    public void someAsyncMethod(String arg);
    }

    @ComponentName

    以下为@ComponentName标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface ComponentName {
    }

    @ComponentName标签用在一个Java类的字段或setter方法上,用以注入组件的名字。

    以下为定义一个组件名称的字段的例子。

    @ComponentName
    private String componentName;


    @ComponentMetadata

    以下为@ComponentMetaData标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface ComponentMetadata {
    }

    @ComponentMetadata标签标注在一个用于注入组件元数据对象的Java类字段或setter方法上,元数据是一个对应当前组件在组件定义文件中的元素的对象。字段或setter方法的类型的全名为org.osoa.sca.model.Component.。Component接口以及其他模型接口都是根据SDO 2.0 [1] XML schema 到 Java映射规则从SCA XML shema文件中生成的。返回的对象也可以强制转型为commonj.sdo.DataObject。

    以下是一个组件元数据字段的定义的例子。

    @ComponentMetadata
    private Component componentMetadata;

    @Context

    以下是@Context 标签的的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface Context {
    }

    @Context标签标注在一个用于注入模块上下文的Java类字段或setter方法上,类型都是ModuleContext。

    以下是一个ModuleContext字段类型的定义。

    @Context
    private ModuleContext moduleContext;

    @Destroy

    以下是@Destroy标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target(METHOD)
    @Retention(RUNTIME)
    public @interface Destroy {
    }

    @Destroy标签用来标注一个Java类的方法,该方法会在类所实现的本地服务定义的范围结束的时候被调用。该方法必须带零个参数并且没有返回值,且标注的方法必须为public。

    以下为一个销毁方法的定义。

    @Destroy
    void myDestroyMethod() {

    }

    @Init

    以下是@Init标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target(METHOD)
    @Retention(RUNTIME)
    public @interface Init {
    public boolean eager() default false;
    }

    @Init标签用来标注一个Java类的方法,该方法会在类所实现的本地服务定义的范围开始的时候被调用。该方法必须带零个参数并且没有返回值,且标注的方法必须为public。

    所标记的方法将在所有属性和引用均注入以后被调用。

    @Init标签有以下属性:

    eager – 对于有范围的组件, eager = true 告诉容器在创建组件的范围以后马上实例化该组件。当eager = false的时候, 组件的实例是在它们首次被引用的时候实例化的。缺省值为false。

    以下是一个init方法的定义的例子。

    @Init
    void myInitMethod() {

    }

    @Property

    以下是@Property标签的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface Property {
    public String name() default "";
    public boolean required() default false;
    }

    @Property标签是用来标记Java类的一个用于注入配置属性的字段或setter方法。所注入的属性的类型是由Java类的字段类型或setter方法的输入参数类型来确定的。

    即便没有@Property标签,属性也可以通过public的setter方法被注入。但对于非public的字段的注入就必须使用@Property标签。如果不使用@Property标签,则属性的名字就是字段或者setter方法的参数的名字。

    当一个属性既有setter方法也有字段时,则使用setter方法。

    @Property标签有如下属性:

    • name – 属性的名字,缺省是Java类的字段的名字
    • required – 指定是否注入是必须的,缺省为false

    以下是一个属性字段定义的例子。

    @Property(name="currency", required=true)
    private String currency;

    以下是一个属性setter方法的例子

    @Property(name="currency", required=true)
    public void setCurrency( String theCurrency );

    @Reference

    以下是@Reference标签的的类型定义。

    package org.osoa.sca.annotations;
    import java.lang.annotation.ElementType.*;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy.*;
    import java.lang.annotation.Target;
    @Target({METHOD, FIELD})
    @Retention(RUNTIME)
    public @interface Reference {
    public String name() default "";
    public boolean required() default true;
    }

    @Reference标签是用来标记Java类的一个注入服务引用的字段或setter方法。

    即便没有@Reference标签,引用也可以通过public的setter方法被注入。但对于非public的字段的注入就必须使用@Reference标签。如果不使用@Reference标签,则引用的名字就是字段或者setter方法的参数的名字。

    当一个引用既有setter方法也有字段时,则使用setter方法。

    @Reference标签有如下属性:

    • name – 引用的名字,缺省是Java类字段的名字
    • required – 引用的注入是否是必须的

以下是一个引用字段定义的例子。

@Reference(name="stockQuote", required=true)
private StockQuoteService stockQuote;

以下是一个引用的setter方法的例子

@Reference(name="stockQuote", required=true)
public void setStockQuote( StockQuoteService theSQService );

@Remotable

以下是@Remotable标签的的类型定义。

package org.osoa.sca.annotations;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Target;
@Target(TYPE)
@Retention(RUNTIME)
public @interface Remotable {
}

@Remotable标签用于标记一个Java服务接口为远程的。远程服务能通过入口点对外发布并能翻译成WSDL的portTypes。

以下是一个远程服务接口定义的例子。

@Remotable
public interface HelloService {

}

@Scope

以下是@Scope标签的的类型定义。

package org.osoa.sca.annotations;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Target;
@Target(TYPE)
@Retention(RUNTIME)
public @interface Scope {
String value() default "stateless";
}

@Scope标签用在服务接口定义或者服务实现类上。

@Scope标签有以下属性:

value – 范围的名字,已支持的取值参见有状态资源模式的实现一节。

以下为一个有范围的接口定义的例子。

package services.shoppingcart;
@Scope(“session”)
public interface ShoppingCartService {
void addToCart(Item item);
}

@Service

以下是@Service标签的的类型定义。

package org.osoa.sca.annotations;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Target;
@Target(TYPE)
@Retention(RUNTIME)
public @interface Service {
Class[] interfaces() default {};
Class value() default null;
}

@Service标签用在一个Java实现上,用来标记其实现的服务的接口。一个用于实现接口的类不一定要有@Service。如果没有标签,则假定它所实现的所有标记为@Remotable的接口就是该组件提供的接口。如果实现的接口都不是远程的,则默认该组件提供的唯一服务就是实现类本身。

@Service标签有以下属性:

  • interfaces – 该组件暴露出来作为服务的接口或类对象的一个数组。
  • value –接口或类对象的名称。两个属性只能指定其中之一。

没有指定属性的@Service标签是没有任何意义,就如同该标签不存在。

服务的服务名称默认是不带包名接口或类的名字。

以下为一个使用服务标签的例子。

package services.hello;
@Service(HelloService.class)
public class HelloServiceImpl implements HelloService, AnotherInterface{
public String hello(String message) {
...
}

}

@Session

以下是@Session标签的的类型定义。

package org.osoa.sca.annotations;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Target;
@Target(TYPE)
@Retention(RUNTIME)
public @interface Session {
public String maxIdleTime() default "";
public String maxAge() default "";
public boolean singlePrincipal() default false;
}

@Session标签用于一个Java类。该标签的属性有如下含义:

  • maxIdleTime – 两个操作在一次会话中运行的最长间隔时间。如果超时,则容器将结束本次会话。
  • maxAge – 整个会话的最大活动时间。如果超时,则容器会结束本次会话。
  • singlePrincipal – 如果为true, 只有启动本次会话的主体(用户)才可以继续操作。

两个以时间为值的属性的取值为,一个整数接一个空格和"seconds", "minutes", "hours", "days" 或 "years"中任意一个的字符串。

如果没有设置超时,则超时的实现将完全由SCA运行期的实现来定义。

以下是一个例子:

package service.shoppingcart;
import org.osoa.sca.annotations.*
@Session(maxAge="30 days");
public class ShoppingCartServiceImpl implements ShoppingCartService {
...
}

@SessionID

以下是@SessionID标签的的类型定义。

package org.osoa.sca.annotations;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Target;
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface SessionID {
}

@SessionID标签是用来标记Java类的一个用于注入session ID的字段或setter方法。系统生成的ID总是字符串,但是应用生成的会话ID则可能是其他复杂类型,如“应用指定的会话ID”一节所述。

以下是一个例子。

@SessionID
private String sessionID;

WSDL 2 Java and Java 2 WSDL

SCA客户端及其Java实现所使用WSDL到 Java和Java到 WSDL的映射规则,使用的是JAX-WS[4]规范所定义的从WSDL portTypes生成远程Java接口及其反向生成规范。

从Java类型到XML schema类型的映射, SCA支持SDO 2.0 [1] 和 JAXB [2]

映射。

使用JAX-WS映射时有以下约束:

  • No support for holders

注意: 这部分规范需要更多关于如何使用JAX-WS客户端异步模型的例子和讨论。

计划中规范的未来增补

本版本规范为不完整的,有些领域将在规范的未来版本中覆盖到。这其中包括:

  • Policy和QOS标签,包括事务、安全和可靠消息。
  • 同步服务操作的一个客户端异步模型。
  • 提供一个服务提供者接口 (SPI) ,使得SCA的容器有能力通过一个定义良好的接口在运行期插入实现。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639375/viewspace-151148/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    188
  • 访问量
    371821