Tuscany和SCA中的策略(下)

日期: 2010-03-30 翻译:杨晓明 来源:TechTarget中国 英文

在《Tuscany和SCA中的策略(上)》中,我们介绍了SCA域内的策略概览以及如何使用意图和策略集来使服务特性的质量能够被使用。下面我们将继续为您介绍,在如何使用意图和策略本身之前,通过描述策略在Tuscany运行时有哪些影响……   策略的运行时   在SCA复合应用中有很多配置策略的方式。提供的灵活性很有用,但是第一眼看去它确实使策略框架看起来有点复杂。不过目标很直接。

仅仅是阐明,为了使服务特性的质量生效,我们的目标在于向绑定或组件实现中加入额外的Java代码。   在我们调查策略模块的更多细节前,这个部分首先采用自下向上的方法,通过观察Tuscany如何让策略代码以策略拦截器的形式加入……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

《Tuscany和SCA中的策略(上)》中,我们介绍了SCA域内的策略概览以及如何使用意图和策略集来使服务特性的质量能够被使用。下面我们将继续为您介绍,在如何使用意图和策略本身之前,通过描述策略在Tuscany运行时有哪些影响……

  策略的运行时

  在SCA复合应用中有很多配置策略的方式。提供的灵活性很有用,但是第一眼看去它确实使策略框架看起来有点复杂。不过目标很直接。仅仅是阐明,为了使服务特性的质量生效,我们的目标在于向绑定或组件实现中加入额外的Java代码。

  在我们调查策略模块的更多细节前,这个部分首先采用自下向上的方法,通过观察Tuscany如何让策略代码以策略拦截器的形式加入到运行时中。这需要回答某些让人挑剔的疑虑,比如关于一个策略配置是如何导致某些实际发生在运行时的应用中。

  策略的拦截器

  Tuscany框架设计的初衷是为了让额外的java代码片能轻松地加入。在绑定和实现之间,在一个SCA的wire末端的服务和引用两者间,Tuscany框架创建了拦截器链,每个服务操作都有一个。链上的每个拦截器操纵这入站和出站的消息。处理的执行依赖我们所说的拦截器,举个例子,一个绑定拦截器可能把消息内容从一种格式转化成另一种格式。一个策略拦截器,从另一个方面,可能加密或解密一个消息。

  图2 给了一些运行时物件的抽象视图,这些物件由Tuscany,当你在两个SCA组件间创建一个wire的时候创建。

图2

  图2: 一个高层次的概览,这个概览是关于Tuscany运行时如何沿着链隔一段就使用消息拦截器,从而让策略功能插入进来 。在每个组件的服务和引用内,每个操作都有拦截器链。

  在图2中,组件A有一个名叫ReferenceA的引用,连接组件B的服务B。这个引用和服务有个兼容的绑定,这个绑定的类型没有在这指定。这个绑定类型没有在这个图中指定是因为这个机制同样不管你选的是哪个绑定。

  在这个引用和服务内,我们看到三行,或者说三个拦截器链。链是为每个操作构建的,操作是由引用A和服务B的接口所提供的。在这种情况下,接口有三个操作,、操作1,、操作2,和操作3。

  操作2的一个消息从组件A经由引用A沿着三个拦截器的中间链而过。首先由它实现策略的拦截器处理。接下来恰好是由这个链上的其他拦截器处理,举个例子,拦截器用来执行绑定的转化。最终,这个消息由交互处理,这个交互策略拦截器在被传给传输消息的引用绑定,使用服务绑定的某些协议。

  在服务端,处理被颠倒过来。消息从绑定传入这三个链的中间,从操作2中构造出来推动消息。首先,在继续通过链上的其他拦截器前,这个消息传递经过策略处理器的交互。最终,它由实现策略拦截器处理,并且被传给组件B实现上的操作2。

  通过拦截器链,看到像日志或加密如何被实现并用Tuscany拦截器加入到运行时应用中的策略功能不难。

  拦截器接口

  链上的每个拦截器不得不能够去做两件事。它不得不处理消息然后传递这个消息到下一个拦截器。为了达到每个拦截器实现一个非常简单的Tuscany提供的叫做Interceptor的接口。

以下是引用片段:
public interface Interceptor extends Invoker { 
void setNext(Invoker next); 
Invoker getNext(); 

  你可以看出Interceptor接口只允许链上的拦截器连接在一起。Tuscany框架在链上加入了下一个拦截器,通过链上前一个拦截器的叫做setNext()的方法。Invoker基类提供的接口沿着链传递这个消息,也是同样简单。

以下是引用片段:
public interface Invoker { 
Message invoke(Message msg); 

  这里的消息类型是Tuscany类,当它们在绑定和组件实现之间传递时,这个类大体上代表了这些消息。

  一个简单的拦截器例子是日志实现策略拦截器,我们已经提到过。清单1的代码展示了一个非常简单的日志策略拦截器版本,这个拦截器使用了JDK日志来打印出关于传给或传出组件实现的信息。

  清单1 一个JDK日志策略拦截器简单版本

以下是引用片段:
public class JDKLoggingPolicyInterceptor implements Interceptor { 
private Invoker next; #A 
public JDKLoggingPolicyInterceptor(String context, 
Operation operation, 
PolicySet policySet) { 
} #A 
public Message invoke(Message msg) { 
logger.logp(Level.INFO, #B 
context, 
"", 
"Invoking operation - " + operation.getName()); 
return getNext().invoke(msg); #C 

public Invoker getNext() { 
return next; 

public void setNext(Invoker next) { 
this.next = next; 

  #A配置大部分忽略

  #B记录操作名

  #C调用写一个拦截器

  在这个JDK日志策略拦截器的极其简化版中,所有的构造代码已经被省略,而且这个调用方法只打印出操作的名字,而没有穿过消息的细节 。当拦截器在wire的引用或服务末端被当做一个实现拦截器加入时,影响是一样的。操作名为每个发送的消息打印出来。你可以在Tuscany 策略日志模块中看到完整的实现。

  给你展示这个的目的不是为了提供一个深入的策略拦截器构造指南,但只是给你展示它,在今天的结尾,策略只是对在绑定和组件实现间传递的消息起作用。

相关推荐