应用JSF、Ajax和Seam开发Portlets(1/3)
本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

作者 Boris Lublinsky译者 郭晓刚 发布于 2007年8月10日 上午4时36分
当前大多数SOA方面的文章书籍都集中在个别的业务服务的定义和实现。构建企业的解决方案通常都需要结合多个现有的企业服务。这些复合而成的服务又可以与其他服务再次复合成更高级的解决方案。这种业务服务的递归复合是SOA最重要的特性之一,它使我们可以快速地在现有业务服务的基础上构建新的解决方案。随着业务服务(及其复合)的数量增长,要实现新的企业解决方案也变得更加容易。
按照《Toward a pattern language for Service-Oriented Architecture and Integration 》的定义,产生复合服务的主要推动力来自以下方面:
复合服务有两个方面(按照《Tools for Composite Web Services: A Short Overview》的说法):复合设计,关注的是综合的规范,来确定如何协调各组件服务(Component Service)去满足客户请求;复合的实现,即如何执行由复合设计产生的规范,以实际达成各服务之间的协调。
在本文中,我们将分别从设计和实现两方面讨论复合服务的主要方式。
复合设计是关于如何在一组现有服务的基础上设计出一个解决方案。它要做的是确定复合设计中用到的各个服务、它们之间交互的方式、以及复合的拓扑。
根据《Service–Oriented Composition in BPEL4WS》,复合的交互主要有两种设计方式:
对于分层复合,复合服务的实现对于服务的消费者是完全不透明的(黑盒)。调用服务的消费者一直等待到执行完成,然后(直接或间接地)使用执行的输出结果(图1)。

图1 分层服务复合
这种复合方式对于实现逐层分解的系统来说非常自然。每个层次被实现成一个独立的复合服务,并协调低一层的(符合)服务的执行。这也是工作流系统中对高层方案通常采用的建模方式——对一系列活动进行组合,而每个活动可对应一个低层的业务过程、或者由人或程序执行的一项任务。虽然任意复合服务可被使用它的外部系统监控和中断,但除了最初的调用之外,复合服务并不与服务的消费者发生任何其它功能性的交互1。
虽然黑盒复合方式(分层复合)是对付复杂性的强有力工具,但在某些情况下消费者仍然需要根据执行的即时结果来控制复合服务的执行。会话复合可以完成这种功能。在会话复合的情形中,复合服务的实现对于服务的消费者仍然是完全不透明的,但特定的即时执行结果可被暴露给消费者(灰盒)。
这是通过支持显式的会话状态来实现的(会话状态和执行状态的区别请见[4])——复合服务然后向消费者暴露出多个接口:一个用作原来的服务调用,其他的用作获取即时结果以及依此控制服务的执行(图2)。

图2 会话服务复合
在这种复合类型中,进行交互的消费者和提供者被看作是对等的伙伴,互相交换数据和控制信号。
两种交互方式都是可行的复合设计方案。运用严格的层次结构是对复杂业务过程建模的地有效途径,工作流技术的成功是一个证明。另一方面,会话的丰富表现方式让它更容易抓住日常业务交互的精髓——谈判的行为、对结果的监控等等——通过明确地为消费者和服务之间的信息交互建立模型。
复合服务的设计不光需要定义服务的交互活动,也需要为其实现定义成员和拓扑。复合服务的拓扑有两种主要设计方式("《Service–Oriented Composition in BPEL4WS》"):
基于中介的拓扑(图3)假设存在一个被称为中介者的服务,它担当着一个特殊角色,既与服务的消费者交互,又控制参与本复合的其他服务(或复合服务)的执行。

图3 基于中介的复合拓扑
在基于中介的分层复合服务中,中介者实现一个编制规划(Orchestration Schema)以定义成员服务的调用序列,从而在特定的约束下完成特定的目标。中介者的实现可以采用不同的方式,包括编制语言/引擎、OWL-S复合、Petri Net等等。
在基于中介的会话复合服务中,中介者按照消费者的输入实现服务状态和状态的转换。中介者的典型实现一般都基于转换系统(Transition System)或有限状态机。
在对等拓扑中不存在中介者的概念。每个参与的服务(成员服务)都可以(部分地)执行复合服务(图4)。

图4 对等(Peer-to-Peer)复合拓扑
复合,在这里被定义为一个消息发送模板,成员服务可被插入其中。其目标行为被定义为一个允许的消息交换序列的家族,并应由系统具现化。一般这种拓扑仅被用于实现分层复合服务,因为它缺乏支持会话状态所必需的机制(即实现会话型交互的需求)。
看起来实现服务中介者的最简单方式是使用通用编程语言(图5)。

图5 编程实现复合服务
不幸的是,这种方案有几个缺陷:
虽然已经存在若干实现复合服务的框架(例如WS-CAF),用编程方式实现复合服务看起来并非一个正确的选择。
另一种实现复合服务的可能方式是基于事件的复合。这种复合实现建立在基与事件的服务交互的基础上:服务消费者向发布/订阅代理(Publish/Subscribe Intermediary)发布事件,代理再向实际的服务提供者投递事件(图6)。

图6通过发布/订阅机制的服务交互
在这种情形中,发布/订阅引擎作为一个中间层,在服务消费者和提供者之间起到了解耦的作用,因此可以允许极其灵活的复合服务实现。复合服务可以被实现成下面的样子(图7):

图7用事件实现复合服务
服务消费者将初始化事件(通过发布/订阅引擎)投递到订阅了此事件的若干服务。随后,每个服务可以发送另一个消息来(通过同样的发布/订阅引擎)调用另外一些服务。这样的事件序列有效地创造出了一个复合服务。通过发布/订阅机制实现的复合服务有以下特点:
通过使用编制引擎(Orchestration Engine)来实现服务中介者,可以进一步完善复合服务的实现(图8):

图8用编制引擎(Orchestration Engine)实现复合服务
这种实现方式通过采用编制语言(Orchestration Language)而非通用语言,从而改进了前述的编程实现方式。这意味着我们可以使用量身定做的可视化编辑器来编写/维护复合逻辑。这也意味着我们可以利用编制引擎的强大功能,编制引擎内建支持异步调用、状态管理、事务的补偿(Compensation)等等。使用编制引擎来实现复合服务有以下优点:
综上所述,在前面讨论的三种方式中,基于编制的实现看起来是创建复合服务最可行的方式。
复合服务在SOA实现中扮演了重要角色,它带来了以下优点:
本文讨论的各种复合服务的设计方式针对了多种多样的业务场景,因此我们可以为特定的业务需要设计出最适合的复合服务(及其拓扑)。
最后,我们建议使用编制引擎来实现复合服务。
Boris Lublinsky在软件工程和技术架构上有超过25年的经验。在最近几年中,他主要关注企业架构、SOA和过程管理。在他的整个职业生涯中,Dr. Lublinsky经常作技术演讲和写作工作。他在不同杂志上出版了超过40篇技术文章,包括Avtomatika i telemechanica、IEEE Transactions on Automatic Control、Distributed Computing、Nuclear Instruments and Methods、Java Developer’s Journal、XML Journal、Web Services Journal、JavaPro Journal、Enterprise Architect Journal和EAI Journal。最近Dr. Lublinsky为一家大型咨询公司工作,职责包括开发和维护SOA策略和框架。可以通过blublinsky@hotmail.com联系他。
1. Ali Arsanjani. Toward a pattern language for Service-Oriented Architecture and Integration, Part 2: Service composition. Developworks, December 2005.
2. Richard Hull, Jianwen Su. Tools for Composite Web Services: A Short Overview.
3. Rania Khalaf, Nirmal Mukhi, Sanjiva Weerawarana. Service–Oriented Composition in BPEL4WS.
4. B. Lublinsky. Defining SOA as an architectural style. IBM Developworks, January 2007
5. Web Services Composite Application Framework (WS-CAF)
查看英文原文:Service Composition
本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。
在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。
InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!
在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。
通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。
本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。
InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。
相对于Java,.NET在持续重构方面所给与的重视仍然少为人知,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Danijel Arsenovski试图为你揭示这些谜题。
1 条回复
回复