科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Tuscany SCA 服务调用过程分析

Tuscany SCA 服务调用过程分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Tuscany于8月31日发布了0.99版本,此版本较之前发布的0.91版本在结构上做了较大的调整,其服务的调用方式又重新进行了规划,本文就其服务调用过程进行探讨。

作者:王锋 来源:论坛整理 2007年12月15日

关键字: Tuscany SCA 服务 调用 分析

  • 评论
  • 分享微博
  • 分享邮件
摘要:Tuscany于8月31日发布了0.99版本,此版本较之前发布的0.91版本在结构上做了较大的调整,其服务的调用方式又重新进行了规划,本文就其服务调用过程进行探讨。

  1 调用接口

  public <B> getService(Class <b>businessInterface, String serviceName)

  根据提供Component中定义的Service名称,以及要转换的类型取得要调用的Service接口。

  参数描述:businessInterface

  当前版本的businessInterface定义对Version 0.91进行了扩充,不仅支持接口,而且支持实现类,这主要是在生成代理时做了扩充,对接口类型采用JDK的ProxyFactory生成代理,而对实现类采用Cglib生成代理。

  参数描述:serviceName

  定义Service的名称,采用ComponentName/ServiceName的方式来表明哪个Component下的具体Service,如果Compnent下仅定义了一个Service,则此ServiceName可以省略,仅保留CompnentName。但是如果Component下定义了多个Service,则必须指明ServiceName,以标明具体的Service。这种方式与以前实现有点不同,在上一版本中对ServiceName不限制,即使Component下包含多个Service,默认取第一个Service,因为在组装是已经定义好了。

  2 调用原理

  Tuscany对Service的调用都会委派到RuntimeComponentContext中,把Component中的每个Service都生成Component中定义的SelfReference,然后在Reference中调用其Service,根据接口的名称生成代理。

  对应的序列图如下:

  

  业务接口调用:

  在调用业务接口时会调用Proxy中的Invoke方法,在模型的组装过程中都会为每个Component的Service和Reference生成一个RuntimeWire对象,记录Service和Reference的模型组装信息。而在业务接口调用过程中,会针对Service和Reference中的每个方法生成一个InvocationChain对象,来记录调用的链。这与以前版本也有一点微小的区别,当前版本充分利用了Lazy Loading的思想,仅当调用的时候才会针对每个方法生成InvocationChain,而不象以前在组装的时候就已经把InvocationChain组装好了。

  对服务的调用采用链式结构有一个比较大的好处是可以支持异步调用,如果调用的过程支持异步方式,则会在调用链的头部添加一下NonBlockingInterceptor,启动一线程进行服务的调用而不是采用阻塞的方式直接返回。同时,采用链式结构就给用户提供了一种扩展,可以在服务调用的时候添加用户自己的Interceptor,比如在调用过程中用户自己的上下文切换及调用过程的日志记录等。而且在Tuscany中针对不同类型的匹配及转换也是采用Interceptor来实现的,通过在链中添加DataBinding Interceptor,来把类型转换为需要的类型,比如字符串与XML的相互转换等。

  3 结束语

  Tuscany的服务调用过程给了我们许多的启示,怎样在调用中实现类型的实现转换以及采用链式调用的优点等,这可以给我们在实现的开发设计过程中提供借鉴。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章