扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:王锋 来源:论坛整理 2007年12月15日
关键字: Tuscany SCA 服务 调用 分析
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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者