Tuscany SCA 服务调用过程分析

日期: 2007-12-13 作者:王锋 来源:TechTarget中国

  1 调用接口

  public B getService(Class 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的服务调用过程给了我们许多的启示,怎样在调用中实现类型的实现转换以及采用链式调用的优点等,这可以给我们在实现的开发设计过程中提供借鉴。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

作者

王锋
王锋