<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>科技之门 - 软件测试</title><link>http://www.icdoor.com/z-blog/</link><description>www.icdoor.com - </description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80710</generator><language>zh-CN</language><copyright>Copyright 2003-2007 www.icdoor.com. All Rights Reserved.京ICP备05039017号.Powered By Z-Blog.Top</copyright><pubDate>Tue, 07 Sep 2010 02:59:18 +0800</pubDate><item><title>test</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/12/19/3509.html</link><pubDate>Fri, 19 Dec 2008 00:00:49 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/12/19/3509.html</guid><description><![CDATA[<p>test</p>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/12/19/3509.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=3509</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=3509&amp;key=7fc240d7</trackback:ping></item><item><title>在RAD中开发、配置并测试基于SessionBean的Scheduler任务</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2695.html</link><pubDate>Fri, 21 Nov 2008 08:51:44 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2695.html</guid><description><![CDATA[关键字：SessionBean的Scheduler任务<BR/><P><FONTface=Verdana>本文介绍了WebSphereApplicationServer提供的应用编程扩展之一：Schedule的相关概念，以向控制台输出"HelloWorld"信息作为一个任务并以此为例说明了在RationalApplicationDeveloper中如何开发、创建、配置并最终测试这一Schedule任务。<BR/>1.前言</FONT></P><P><FONTface=Verdana>本文介绍了WebSphereApplicationServer提供的应用编程扩展之一：Schedule的相关概念，以向控制台输出"HelloWorld"信息作为一个任务并以此为例说明了在RationalApplicationDeveloper中如何开发、创建、配置并最终测试这一Schedule任务。</FONT></P><P><FONTface=Verdana>2.Scheduler简介</P><P></P><P>Scheduler是WebSphereApplicationServer提供的应用编程扩展之一。Scheudler服务提供了WebSphereApplicationServer中配置、管理与开发基于时间的工作任务的功能。在Scheduler服务管理之下，特定的操作或任务可在将来的某一时间运行一次，也可以按指定的时间间隔反复运行。WebSphereApplicationServer中的Scheduler服务为管理和调度任务提供了高的可靠性和运行性能，同时提供了对任务的持久存储管理与事务管理。</P><P>使用Scheduler服务管理任务具有以下优点：</P><P>简化系统管理步骤，降低系统管理成本<BR/>将特定的任务交由Scheduler服务调度、管理并执行，可极大的简化管理步骤，降低管理成本。同时，Scheduler服务在WebSphereApplicationServer中的管理也与其它资源的管理具有很好的一致性，对Scheduler服务的创建、更新、调度、验证以及监控等任务均可在WebSphereApplicationServer管理控制台中完成。<BR/>可扩展<BR/>Scheduler服务可在集群环境下工作，使用负载均衡可达到更佳性能并提供更高的可靠性。<BR/>多样的日期算法<BR/>Scheduler服务根据为每一任务指定的日历来决定该任务何时开始执行、每隔多长时间运行一次以及重复执行多少次。UserCanlendar接口实现类即包括定义的日期算法已确定任务被执行的时间。如果WebSphereApplicationServer提供的缺省UserCanlendar实现无法满足需要，开发人员可开发特定的日历并将其指定给任务。<BR/>一般而言，具备以下特性的任务可考虑将其托管给Scheduler服务进行管理与调度：</P><P>在系统负载较低时（如夜间）定期执行的备份、清除等任务<BR/>与用户没有交互的后台任务<BR/>需要运行较长时间的任务<BR/>需定时执行或反复执行的任务</P><P></P><P><BR/>2.1.调度程序</P><P>调度程序是WebSphereApplicationServer中使用管理控制台进行配置的，为Scheduler服务提供任务的持久存储、事务管理以及安全管理的应用程序。可在单个服务器、集群、节点或单元中创建多个调度程序。每个配置后的调度程序是一个独立任务调度引擎，它拥有唯一的Java命名与目录接口（JNDI）名称、持久存储设备和守护程序。</P><P>必须先使用管理控制台、配置服务或脚本编制配置调度程序，应用程序才能使用Scheduler服务。概念上，调度程序类似于数据源，我们必须为它指定包括绑定实例的JNDI名称在内的各种配置属性。一旦定义了调度程序，使用调度程序API或WASSchedulerMBean的应用程序就可以查找调度程序对象并调用各种方法来管理任务。</P><P>调度程序的运行依赖于一个数据库，以用于存储它的持久信息。数据库及其位置应当由应用程序开发者和服务器管理员决定。调度程序使用这个数据库来存储然后运行这些任务。同时，当我们在每个调度程序配置中指定唯一的表前缀值时，多个调度程序可以共享一个数据库。这种共享可以降低调度程序数据库的管理成本。</P><P>2.2.Scheduler任务实现</P><P></P><P>Scheduler服务可调度由以下两种方式实现的任务：</P><P>调用会话Bean的任务<BR/>发送java消息的服务<BR/>在本文中，我们将使用在控制台中打印输出"HelloWorld"作为任务并以此为例说明在RationalApplicationDeveloper中如何开发、部署和测试调用会话Bean的任务。</P><P>2.3.Scheduler服务相关接口说明</P><P>2.3.1.Scheduler接口</P><P></P><P>在调度程序配置的JNDI名称空间中存在一个com.ibm.websphere.scheduler.SchedulerJava对象。您可以通过查找JNDI名称获取调度程序的引用。获得对Scheduler对象的引用后即可以对任务执行创建、暂挂、取消等操作。</P><P>2.3.2.TaskInfo接口</P><P>TaskInfo对象包含可用于创建任务的信息。这类信息包括任务的名称，标识，开始运行时间，重复运行的时间间隔，重复运的次数以及为任务指定的UserCalendar对象。</P><P>该类有多种实现方法，每种方法对应于一种可以运行的任务。可用的TaskInfo实现有：</P><P>BeanTaskInfo：调用无状态会话bean。</P><P>MessageTaskInfo：将JMS消息发送到队列或将消息发布到主题。</P><P>创建TaskInfo对象后，可以通过调用Scheduler.create()方法将该对象提交到调度程序以创建任务。</P><P></P><P>2.3.3.TaskHandler接口</P><P>任务处理程序是一个用户定义的无状态会话bean，它由使用BeanTaskInfo对象创建的任务调用。任务处理程序bean使用以下主接口和远程接口：</P><P></P><P>com.ibm.websphere.scheduler.TaskHandlerHome<BR/>com.ibm.websphere.scheduler.TaskHandler<BR/></P><P><BR/>bean本身需要实现远程接口中定义的process()方法。如果使用BeanTaskInfo对象创建任务，每当运行任务时，将调用TaskHandler会话bean中的process()方法。因此，任务所包含的业务逻辑应在此方法种实现。</P><P>2.3.4.UserCanlendar接口</P><P>用户日历是一个用户定义的无状态会话bean，当任务需要计算与日期相关的值时会调用它。实现一个用户日历必须实现UserCanlendar接口。用户日历bean使用以下home接口和远程接口：</P><P></P><P>com.ibm.websphere.scheduler.UserCalendarHome<BR/>com.ibm.websphere.scheduler.UserCalendar<BR/></P><P><BR/>bean本身需要实施远程接口中的applyDelta()和validate()方法。</P><P>用户日历用于计算时间间隔，如任务运行之间的时间。在其被创建后使用setUserCalendar()方法在TaskInfo接口进行设置，并在需要计算变化量时由调度程序运行时代码调用。</P><P>TaskInfo接口提供以下方法指定了使用用户日历进行计算的变化量字符串：</P><P></P><P>setStartTimeInterval<BR/>setStartByInterval<BR/>setRepeatInterval<BR/></P><P><BR/>如果未使用TaskInfo.setUserCalendar()方法指定用户日历，系统将使用一个缺省用户日历。缺省日历允许简单变化量规范，如秒、分、时、天和月。WebSphereApplicationServer提供两种类型的缺省用户日历：</P><P>CRON：该种类型的日历根据一个以空格或Tab键分隔的字符串表达式计算时间。</P><P></P><P>SIMPLE：该种类型的日历简单的根据java.util.Canlendar对象计算时间。</P><P>由于SIMPLE类型的日历计算方法较为简单也较容易理解，在此我们只距离说明CRON类型的日历。CRON日历根据以下格式的字符串结算时间：</P><P>秒分小时日月星期</P><P>在表示某一具体时间项目时，"*"号表示任意值；用"，"号分隔特定的有效值；"-"号表示特定范围；"/"表示增量；"?"表示不确定值。例如：</P><P>0231019FEB?</P><P>表示二月19日10点23分零秒；</P><P>0*12/6?JAN-JUNSAT,SUN</P><P>表示一月至六月，每月的周六与周日两天，每天中的12点、18点和24点，每小时中的任意一分钟。</P><P>当使用CRON类型的缺省用户日历时，可使用以上格式的字符串计算任务开始时间及时间间隔。</P><P>请注意，由于Scheduler在调度任务时并不会精确到秒，因此推荐将表示秒的一项始终设为0。</P><P></P><P>3.开发基于会话Bean的schedule任务</P><P>为运行本文中的例子，您必须安装以下软件产品：</P><P>RationalApplicationDeveloper6.0</P><P>DB2Universalv8.0或以上版本</P><P>RationalApplicationDeveloper6.0</P><P>提供了开发、测试scheduler的运行时环境，而DB2将作为存贮调度程序持久信息的数据库。</P><P>首先打开RationalApplicationDeveloper，选择某一目录作为RAD的工作空间目录，如下图所示：</P><P><BR/>图31选择RAD工作空间</P><P><IMGsrc="/Image/200811218455783077801.jpg"border=0><BR/>选择进入J2EE视图，创建一个EJB项目用以开发由会话Bean实现的任务，如下图所示：</P><P></P><P><BR/>图32新建EJB项目</P><P><IMGsrc="/Image/200811218455789077802.jpg"border=0><BR/>右键单击"EJB项目"，选择"新建"-&gt;"EJB项目"，输入"ScheduleEJB"作为EJB项目名称，输入"ScheduleEAR"作为EAR项目名称，接受其它缺省选项，点击"完成"。创建EJB以及EAR项目后，项目资源管理器如下图所示：</P><P><BR/>图33项目资源管理器</P><P><IMGsrc="/Image/200811218455796077803.jpg"border=0><BR/>单击创建的EJB项目"ScheduleEJB"，展开"部署描述符：ScheduleEJB"-&gt;"会话Bean"，右键单击"会话Bean"，选择"新建"-&gt;"会话Bean"，如下图所示：</P><P><BR/>图34新建会话Bean</P><P><IMGsrc="/Image/20081121845582077804.jpg"border=0><BR/>输入"Schedule"作为会话Bean名称，输入"ibm.sample.schedule"作为包名，点击"下一步"</P><P></P><P><BR/>World"信息之一任务为例，说明了在RAD中如何开发、创建、配置并最终测试这一Schedule任务。</P><P>6.总结</P><P>Scheduler可为J2EE应用程序提供高性能的、具有高可靠性的计时服务功能，它可对被托管的任务进行持久存储并提供事务管理。Scheduler服务通常被广泛用于调度、管理与时间相关的任务或活动，这些任务可调用会话Bean或发送JMS消息，而对Scheduler的管理可通过JavaAPI或JMX实现。</P><P>参考资料</P><P>WebSphereApplicationServerV6.0在线帮助</P><P><BR/>WebSphereApplicationServerEnterpriseVersion5andProgrammingModelExtensions</P><P><BR/>WebSphereEnterpriseScheduler规划和管理指南</P><P></FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2695.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2695</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2695&amp;key=f771c7e7</trackback:ping></item><item><title>跨越边界:延续、Web开发和Java编程</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2694.html</link><pubDate>Fri, 21 Nov 2008 08:51:35 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2694.html</guid><description><![CDATA[关键字：Java编程<BR/><P><FONTface=Verdana>跨越边界系列讨论非Java&#8482;语言如何解决一些重要问题以及这些解决方案对当今的Java开发人员有什么意义。本文讨论延续（continuation），这是Smalltalk的Seaside这类框架背后的技术。延续服务器（continuationserver）提供了一个有状态的编程模型，同时又没有舍弃无状态所固有的可伸缩性，从而使构建Web应用程序更加容易。<BR/>一般的Web开发有时候很有趣，但是通常却是令人烦恼的。JavaWeb开发人员要花费很长时间来提供无状态模型，但是产生的性能和部署的简单性使得这种努力是值得的。在本文中，我将讨论一种完全不同的Web开发方式，称为延续服务器（continuationserver）。延续服务器提供了一个有状态的编程模型，同时又没有舍弃无状态所固有的可伸缩性，从而使Web应用程序开发更加容易。关于本系列</FONT></P><P><FONTface=Verdana>在跨越边界系列中，作者BruceTate提出这样一种观点，即通过学习其他方法和语言，当今的Java程序员可以更好地武装自己。由于Java技术已经成为所有开发项目最好的选择，所以编程方式已经发生了改变。其他框架影响着Java框架的构建方式，您从其他语言学到的概念也可以影响Java编程。您编写的Python（或Ruby、Smalltalk等语言）代码可以改变编写Java代码的方式。</FONT></P><P><FONTface=Verdana>这个系列介绍与Java开发完全不同的编程概念和技术，但是这些概念和技术也可以直接应用于Java开发。在某些情况下，需要集成这些技术来利用它们。在其他情况下，可以直接应用概念。单独的工具并不重要，重要的是其他语言和框架可以影响Java社区中的开发人员、框架，甚至是基本方式。<BR/><BR/></FONT></P><P><FONTface=Verdana>Web的出现</FONT></P><P><FONTface=Verdana>当20世纪90年代中期整个行业转向Web开发时，软件开发人员们欣喜若狂。与“终端加主机”模式相比，我们现在构建的客户机-服务器应用程序对用户更友好，但是也有几个问题困扰着我们：</P><P></P></FONT><P><FONTface=Verdana>性能往往很差。基于终端的开发中好的方面之一是，通信开销受到编程模型的约束。一旦这些约束消失了，我们就会缺乏构建简单分布式应用程序所需的带宽、工具或技能。</FONT></P><FONTface=Verdana><P><BR/>应用程序无法移植。大多数客户机-服务器开发环境要求使用专门的硬件和软件环境。</P><P><BR/>应用程序难以部署。必须单独地管理数千个客户机。</P><P><BR/>最大的开销是隐藏的。部署成了最重要的约束，因为进入生产阶段之后的开销大大增加了。<BR/>客户机-服务器计算仍然向前发展。公司常常是根据比较低的软件和硬件开销来做出财务决策，但是在进入生产阶段之后管理开销会大大增加。到了1995年，客户机-服务器模型需要进行重大的改进，而且这种改进确实出现了。</P><P>进入Web开发</P><P>Web开发在20世纪90年代中期迅速发展起来。由于Java语言的出现，开发人员可以用新功能来构建分布式Web应用程序，同时解决了最严重的客户机-服务器问题。这些新功能包括：</P><P></P><P>受约束的通信。请求/响应Web模型具有基于终端的开发的所有特征。用户在表单中进行输入、发出请求并获得响应。客户机和服务器之间的频繁通信受到了控制，性能得到了提高。<BR/>不共享任何东西的体系结构。基于servlet的编程可以是无状态的。这意味着一个servlet可以为任何客户机服务，固定的servlet池可以为许多用户服务。不需要为每个用户保留一个servlet。性能也因此得到了改进。<BR/>客户机上的共同标准。通过在所有客户机上部署一个共同的浏览器，就可以构建一个界面并在所有客户机上产生一致的可视效果。支持多种浏览器客户机虽还有一定问题，但是不像支持本地用户界面库那样困难。许多可移植性问题消失了。<BR/>更好的部署模型。通过将浏览器作为共同的客户机，软件分发大大简化了。公司可以将应用程序部署在少数几个互联网服务器上并在整个企业中共享它们。网络体系结构常常可以在多台服务器之间共享请求，所以要增加处理容量，只需增加服务器。客户端部署也很容易，只需确保客户机上有正确的浏览器。管理因此大大简化了。<BR/>性能、可伸缩性、可管理性和可移植性都大大提高了，互联网革命因此进入了快车道。但是，您必须面对一些重要的问题。</P><P>不是乌托邦</P><P>无状态（stateless）这个简单的单词将沉重的负担从系统转移到了开发人员身上。其后果是不容质疑的：尽管由于不必为每个用户维护一个服务（或servlet），而获得了很好的可伸缩性；但是，对状态进行管理的责任从编程语言转移到了开发人员身上。目前，可以将Web开发看成一系列无状态的请求，见图1：</P><P><BR/>图1.Web应用程序由请求/响应对组成</P><P><IMGsrc="/Image/20081121846030377801.gif"border=0></P><P></P><P><BR/>采用这种模型，浏览器得到了严格控制。应用程序只对浏览器发出的请求进行响应。如果请求是小型的独立请求，那么这个模型是有效的；但不幸的是，对于驱动有多个应用组成部分的Web应用程序，它是不合适的。最常见的例子是在线购物。点击Submit按钮两次，常常会意外地重复订购同一商品。以后当您发现购物车中有重复的商品时会大感意外。</P><P>向用户提供有状态体验的方法通常是：将与一次交谈相关的所有数据放进一个会话中，并用cookie、隐藏字段或URL变量在客户机上标识用户会话。对于每个新的请求，必须依次执行以下步骤：</P><P>从客户机获得用户的标识符<BR/>从会话中恢复交谈状态<BR/>处理用户的请求<BR/>构建响应<BR/>将交谈状态存储在会话中<BR/>将响应发送给用户<BR/>我对这个问题说得太轻描淡写了，因为使用无状态模型来模拟有状态应用程序可能造成更严重的问题。最严重的问题从Web开发刚出现时就存在了，就是如何处理Back按钮。</P><P>老问题的新答案</P><P>在Web开发中，可以利用有状态模型为用户提供无状态体验。您听到这种说法可能会感到震惊。实际上，在HackersandPainters（参见参考资料）中，PaulGraham就讨论了早在1995年在ViaWeb中使用的底层方法。这种方法使用一种称为延续（continuation）的编程控制结构。</P><P></P><P>基本思想是：可以让编程框架在请求之前装载应用程序的状态，并在每个请求之后保存应用程序的状态。我首先介绍一下Ruby编程语言中的延续。</P><P>一个Ruby示例</P><P>如果希望执行代码，请安装Ruby并输入irb。通过在&gt;字符后面输入命令，定义一个称为loop的方法，见清单1：</P><P><BR/>清单1.创建loop方法</P><P>irb(main):001:0&gt;defloop(interrupt)<BR/>irb(main):002:1&gt;foriin1..10<BR/>irb(main):003:2&gt;puts"Valueofi:#{i}"<BR/>irb(main):004:2&gt;callcc{|c|returnc}ifi==interrupt<BR/>irb(main):005:2&gt;end<BR/>irb(main):006:1&gt;end<BR/>=&gt;nil<BR/></P><P></P><P><BR/>loop方法接受一个称为interrupt的参数。它启动一个从1到i的for循环，打印i的值，然后做一些奇怪的事儿。神秘的callcc语句意味着用延续进行调用。可以把延续看成在某一时间点上“冻结的”程序状态。Ruby调用花括号中的代码块，同时传递一个延续对象。花括号中的代码是一个闭包，它仅仅是传递给callcc的代码块。最终结果是，callcc捕获执行的状态并将结果存储在c中。现在，可以调用这个方法并在循环的任意位置中断执行，这会捕获程序的状态。在以后，可以恢复状态。</P><P>现在，执行这个方法两次，见清单2：</P><P><BR/>清单2.执行loop方法</P><P>irb(main):007:0&gt;cont=loop5<BR/>Valueofi:1<BR/>Valueofi:2<BR/>Valueofi:3<BR/>Valueofi:4<BR/>Valueofi:5<BR/>=&gt;#&lt;Continuation:0x2b5a358&gt;<BR/>irb(main):008:0&gt;cont.call<BR/>Valueofi:6<BR/>Valueofi:7<BR/>Valueofi:8<BR/>Valueofi:9<BR/>Valueofi:10</P><P></P><P><BR/>=&gt;110<BR/>irb(main):009:0&gt;cont=loop8<BR/>Valueofi:1<BR/>Valueofi:2<BR/>Valueofi:3<BR/>Valueofi:4<BR/>Valueofi:5<BR/>Valueofi:6<BR/>Valueofi:7<BR/>Valueofi:8<BR/>=&gt;#&lt;Continuation:0x2b562f0&gt;<BR/>irb(main):010:0&gt;cont.call<BR/>Valueofi:9<BR/>Valueofi:10<BR/></P><P><BR/>每次执行调用时，延续会获得执行的状态。所以，使用延续的Web开发框架可以在处理每个请求之后捕获一个延续，并用一个标识符将它存储在会话中。然后，框架可以在处理每个新请求之前从会话中恢复延续，采用的方法与存储用户数据一样。</P><P>优点和缺点</P><P></P><P>延续服务器方式在许多方面都很出色——有状态的编程模型和具有无状态性能的用户体验。这种方式的优点如下：</P><P>它确保了请求之间的无状态。框架可以识别一个URL中的各个延续并将延续存储在会话中。</P><P><BR/>它提供了一个有状态编程模型。框架可以在任何时候恢复任何延续。如果用户第二次提交一个表单，延续可以恢复以前某个时间点上的状态。</P><P><BR/>可以根据业务规则让延续失效，这样就很容易防止两次提交表单。</P><P><BR/>解决了Back按钮的问题。因为可以直接获得任意时间点上的执行状态，如果用户点击了Back按钮，框架只需恢复适当的延续。</P><P></P><P><BR/>线程化变得容易了，因为不共享任何资源。没有资源冲突就意味着大多数线程化问题消失了。<BR/>延续大大简化了Web开发模型。有了延续，就可以将Web应用程序看成具有一系列请求的应用程序，能够提供更多的用户信息。图2给出了修改后的应用程序流。在用户启动应用程序之后，Web服务器处于控制之中。应用程序不再是应付以任意次序到达的任意请求，而是变成了与一个用户进行统一且直接的交谈。</P><P><BR/>图2.延续支持更自然的应用程序流</P><P><IMGsrc="/Image/20081121846035477802.gif"border=0><BR/>与许多高阶抽象相似，延续也有缺点。这些缺点将影响依赖于延续的整体方式。延续服务器必须解决下面这些常见问题：</P><P>延续是昂贵的。将数据放进会话中更容易了，这意味着会有更多的人将更多的数据放进会话中。框架设计者可以利用一种称为部分延续（partialcontinuations）的方法来降低开销，按照这种方法，框架只保存延续中应用程序特有的部分。</P><P><BR/>URL变得难看了。大多数延续服务器会在URL后面附加一个难看的延续标识符。</P><P></P><P><BR/>用户范例改变了。如果大量使用延续服务器，用户体验就会改变。Back按钮实际上会工作，这种体验会让某些用户感到迷惑。例如，如果在购物车中放了某些东西之后点击Back按钮，您会期望应用程序将这些东西从购物车中去掉吗？<BR/>总的来说，我相信延续代表着一种重大的技术进步，在不久的将来您可能会看到流行的延续服务器实现。现在我们来看看其他语言中的某些实现，然后我展示一些具体的细节。</P><P>其他语言中的实现</P><P>有好几种语言都具有基于延续的方法（参见参考资料中的链接以了解关于它们的更多信息）。最常见的实现是用Lisp、Ruby和Smalltalk编写的。</P><P>Seaside是最流行的延续服务器，由AviBryant用Smalltalk实现。如果您希望掌握一个完全不同的极具生产效率的Web开发框架，那么就看看Seaside吧。这种体验会改变您进行Java编程的方式。</P><P><BR/>用Ruby编写的Iowa也是由AviBryant创建的，灵感来自WebObjects。它现在在Ruby中使用和维护，具有一种不同的支持模式。</P><P><BR/>Wee框架是另一种Ruby框架，它具有延续服务器的许多特征，但是没有使用本机语言延续。</P><P></P><P><BR/>Wee：Wee是另一种Ruby延续框架。</P><P><BR/>Continuity：Continuity是一种用于Perl的基于延续的Web编程框架。</P><P></P><P>讨论</P><P>developerWorksblogs：加入developerWorks社区。<BR/></FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2694.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2694</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2694&amp;key=85f0a5dd</trackback:ping></item><item><title>将iSeriesWeb服务导入WebSphereIntegrationdeveloper</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2693.html</link><pubDate>Fri, 21 Nov 2008 08:51:34 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2693.html</guid><description><![CDATA[关键字：iSeriesWeb<BR/><P><FONTface=Verdana>本文介绍了如何将WebSphere&reg;DevelopmentStudioClientforiSeries生成的iSeries&reg;Web服务导入WebSphereIntegrationDeveloper服务组件中。<BR/>引言</FONT></P><P><FONTface=Verdana>进入随需应变的时代以来，我们对业务整合的需求从未如此强烈过。现在，业务部门之间的合作更加频繁，将其各种应用程序进行紧密集成的需求应运而生。先前独立的业务部门被整合起来，以缩减管理经费，并使产量最大化。这种促使业务部门间进行应用程序集成的动力同样存在于企业之间，因为进行合作或并购需要共享数据和流程。</FONT></P><P><FONTface=Verdana>IBM&reg;WebSphereIntegrationDeveloper提供了一个优化的构建集成应用程序的完整的集成开发环境。通过使用WebSphereIntegrationDeveloper，您可以构建和部署扩展并集成了您现有IT资产的集成应用程序。IBMWebSphereDevelopmentStudioClientforiSeries帮助您构建适合iSeries的应用程序。通过随时运用最新的核心理论，WebSphereIntegrationDeveloper还加速了对在WebSphereDevelopmentStudioClient的基础上的应用程序的集成。WebSphereDevelopmentStudioClient可以调用iSeries的业务逻辑。</FONT></P><P><FONTface=Verdana>本文通过Web服务来检验WebSphereDevelopmentStudioClient和WebSphereIntegrationDeveloper的一个集成点。文中展示了如何将WebSphereDevelopmentStudioClientforiSeries生成的iSeriesWeb服务导入WebSphereIntegrationDeveloper服务组件中。然后，您可以通过WebSphereIntegrationDeveloperAssemblyDiagram将该服务组件与其他服务组件集成在一起，形成一个业务集成应用程序。</P><P></P></FONT><P><FONTface=Verdana>在本文中我们向您展示如何：</FONT></P><P><FONTface=Verdana>在WebSphereDevelopmentStudioClient-AdvancedEdition6.0中创建iSeriesWeb服务。<BR/>在WebSphereIntegrationDeveloper6.0中用AssemblyDiagram创建一个Web服务导入组件。<BR/>测试上面创建的Web服务导入组件。<BR/>在创建了WebSphereIntegrationDeveloper服务组件后，您可以使用AssemblyDiagram将其连接到其他服务组件，以创建一个无缝集成的应用程序。不过，这已经超出了本文的讨论范围。</FONT></P><P><FONTface=Verdana>先决条件</P><P>WebSphereIntegrationDeveloper6.0<BR/>WebSphereDevelopmentStudioClient6.0或WebSphereDevelopmentStudioClient6.0-AdvancedEdition</P><P></P><P><BR/>Windows&reg;2000/XPProfessional<BR/>为了达到本次练习的目的，我们在WindowsXPProfessionalEdition中同时使用了WebSphereDevelopmentStudioClient-AdvancedEdition6.0和WebSphereIntegrationDeveloper6.0。此外，我们还使用WebSphereDevelopmentStudioClient-AdvancedEdition6.0来生成iSeriesWeb服务，因为它支持JCA到iSeries的连接。使用WebSphereIntegrationDeveloper6.0来创建用于业务集成应用程序的Import服务组件。</P><P>在WebSphereDevelopmentStudioClient中创建iSeriesWeb服务</P><P>在这一部分中，我们将创建iSeriesWeb服务，在后面WebSphereIntegrationDeveloper将用到它。</P><P>第1步.通过ProgramCall向导生成一个JavaBean和PCML文件</P><P>打开一个WebPerspective。<BR/>新建一个DynamicWeb项目。<BR/>在ProjectExplorer中选择该项目。<BR/>在Workbench菜单栏中，单击CreateProgramCallBean图标。这将打开ProgramCall向导。如果您有一个已包含iSeries程序的定义的PCML文件，则可以将该文件导入到向导中来创建Java&#8482;Bean。否则，使用向导来创建程序和参数定义：</P><P></P><P><BR/>在AddProgram页面键入您的JavaBean、程序对象及其所在的库的名称。您可以单击Browse来查找您想从iSeries服务器调用的程序。<BR/>单击OK。这将确定您想调用的程序或过程。<BR/>在AddParameter页面为每个参数输入名称、长度、数据类型和用法。单击OK。<BR/>单击Next进入向导的下一页。<BR/>在Package字段中，为您希望创建文件的包命名。您可以指定一个新的包名。<BR/>取消选中JavaApplication复选框，并确认已选中Services复选框。<BR/>单击Next，输入将保存在run-time配置文件中的配置信息。<BR/>在Authentication下输入Hostname、UserID和Password的值。<BR/>在Librarylist下键入保存iSeries程序的库文件名，单击Add。<BR/>单击Finish。<BR/>ProgramCall向导会生成三个类。其中一个类名为&lt;YourBeanName&gt;Services.java，是可被Web服务向导用来创建Web服务的JavaBean。另外两个分别名为&lt;YourBeanName&gt;Input.java和&lt;YourBeanName&gt;Result.java。这两个类是JavaBean类的输入和输出参数所需的。</P><P>第2步.通过Web服务向导从JavaBean和PCML文件创建Web服务：</P><P></P><P>您在ProgramCall向导中定义的每个程序都会生成两个方法。您可以任选一个来获取远程程序调用返回的数据。</P><P>第一个方法以XML格式返回输出数据。Web服务客户机可以通过分析XML字符串获取数据。<BR/>第二个方法以&lt;YourBeanName&gt;Result.java类的形式返回输出数据。Web服务客户机可以通过使用该类的getter方法来获取数据。<BR/>现在您可以通过Web服务向导来从ProgramCall向导创建的类中创建Web服务：</P><P>在ProjectExplorer中的JavaResources的package名称下，右键单击&lt;YourBeanName&gt;Services.java。<BR/>依次选择New&gt;Other&gt;WebServices&gt;WebService。（您可能需要选中Showallwizards复选框。）<BR/>单击Next。<BR/>对于Web服务类型，应该已经自动选择了JavaBeanWebService，如图1所示：</P><P>图1.Web服务类型</P><P><IMGsrc="/Image/200811218455749977801.gif"border=0></P><P></P><P>取消选择StartWebserviceinWebproject<BR/>单击Next。<BR/>在ObjectSelection页面上，浏览并找到&lt;YourBeanName&gt;Services。单击Next。<BR/>调整ServiceDeploymentConfiguration设置。您可以将Web服务部署到WebSphereApplicationServer或WebsphereProcessServer中。这两种情况都将从WebSphereProcessServer中调用Web服务（请参见图2）：</P><P>图2.服务部署配置</P><P><IMGsrc="/Image/200811218455763077802.gif"border=0></P><P>单击OK，然后单击Next。<BR/>单击DeselectAll，然后选择方法，这些方法的名称应以ProgramCall向导中JavaBean名称字段的内容开头。单击Next。<BR/>单击Finish。<BR/>现在已经生成了Web服务，我们可以通过WebSphereIntegrationDeveloper来对其进行集成。</P><P>通过WebSphereIntegrationDeveloper集成iSeriesWeb服务</P><P></P><P>在这一部分中，我们将上一节中创建的Web服务集成到WebSphereIntegrationDeveloper组件中。</P><P>第1步.创建服务组件</P><P>打开WebSphereIntegrationDeveloperv6.0（请参见图3）：</P><P>图3.WebSphereIntegrationDeveloper</P><P><IMGsrc="/Image/200811218455767077803.gif"border=0></P><P>在BusinessIntegrationperspective中，右键单击New&gt;Module，创建一个新模块（请参见图4）：</P><P>图4.创建一个新模块</P><P><IMGsrc="/Image/200811218455771077804.gif"border=0></P><P>为这个新模块(iSeriesServiceModule)输入名称，然后单击Finish。缺省情况下，WebSphereIntegrationDeveloper会自动创建图5中所示的模块构件和目录：</P><P>图5.生成的模块构件</P><P><IMGsrc="/Image/200811218455775077805.gif"border=0></P><P></P><P>有关WebSphereIntegrationDeveloper构件的详细信息，请参阅参考资料。</P><P>现在我们可以导入WebSphereDevelopmentStudioClient6.0生成的iSeriesWeb服务WSDL文件了。从iSeriesWeb项目的WebContent\wsdl文件夹复制WSDL文件，并粘贴到BusinessIntegrationPerspective的iSeriesServiceModule项目中。<BR/>将WSDL文件复制到BusinessIntegrationperspective中时，WebSphereIntegrationDeveloper会另外创建一个目录（如果尚未创建）。特别是一个WebServicePort目录以及相应的Ports、Interfaces和DataTypes构件（请参见图6）。它通过分析WSDL文件来获取其中的Ports、PortTypes和Messages信息。</P><P><BR/>图6.生成的目录和构件</P><P><IMGsrc="/Image/200811218455779077806.gif"border=0></P><P>现在我们可以创建将调用iSeriesWeb服务的服务组件了。通过双击Module文件夹中的模块打开AssemblyDiagram。<BR/>将WSDL文件从WebServicePorts拖到AssemblyDiagram<BR/>在Component创建向导中选择ImportwithWebServiceBinding，如图7所示：</P><P></P><P>图7.创建组件</P><P><IMGsrc="/Image/200811218455786077807.gif"border=0></P><P>这将创建一个指向iSeriesWeb服务的服务组件，如图8所示：</P><P>图8.AssemblyDiagram</P><P><IMGsrc="/Image/200811218455792077808.gif"border=0></P><P>同时按下Ctrl S，保存AssemblyDiagram。<BR/>第2步.测试组件</P><P>要测试新组件，请执行下列操作：</P><P>运行WPS6.0测试服务器。<BR/>在服务器上部署您的Web服务和Module应用程序。如果已经在其他地方部署了Web服务，则您只需要在WebSphereProcessServer上部署Module应用程序。否则，您需要将您的Web服务项目从WebSphereDevelopmentStudioClient导入到WebSphereIntegrationDeveloper中，然后与Module应用程序一起部署到WebSphereProcessServer上。<BR/>确保所需的应用程序全部成功部署。<BR/>右键单击AssemblyDiagram中的组件并选择TestComponent</P><P></P><P><BR/>选择WebSphereProcessServer进行测试<BR/>输入值并调用您的服务（请参见图9）：</P><P>图9.测试组件</P><P><IMGsrc="/Image/200811218455799077809.gif"border=0></P><P>结果应与图10中相似：</P><P>图10.输出结果</P><P><IMGsrc="/Image/200811218455850778010.gif"border=0></P><P>有关测试WebSphereIntegrationDeveloper组件的详细信息，请参阅参考资料。</P><P>您已经成功地将iSeriesWeb服务作为服务组件部署到IBMWebSphereIntegrationDeveloper6.0中。现在您可以将该服务组件及其他企业服务组件集成到WebSphereIntegrationDeveloper业务集成应用程序中。</P><P>总结</P><P>在本文中，我们注意到了跨业务部门和企业集成业务应用程序的重要性。面向服务是业务集成的一个关键理念。任何面向服务或面向服务的体系结构(SOA)的基础都是从业务流程开始的，因为服务只是一项业务任务。要成功地提高IT灵活性并解决实际当中的业务问题（例如，改善客户服务、与业务伙伴集成或创建统一的客户视图），您必须使业务与IT紧密结合。</P><P></P><P></P><P>RishiMisra是IBMToronto的一名软件开发人员。他目前在iSeriesApplicationDevelopmentToolsarea工作，致力于多种产品的研究，包括WebSphereDevelopmentStudio和WebSphereDevelopmentStudioClientforiSeries。Rishi于2001年加入IBM，主要从事用于iSeries的ILE编译器的研究。Rishi于1998年获得了滑铁卢大学（UniversityofWaterloo）应用科学学士学位。您可以通过rishi@ca.ibm.com与Rishi联系。<BR/><BR/></FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2693.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2693</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2693&amp;key=ae774ff0</trackback:ping></item><item><title>WebSphereIntegrationDeveloper指导教程——第2部分使用WebSphereIntegrati…</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2692.html</link><pubDate>Fri, 21 Nov 2008 08:51:31 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2692.html</guid><description><![CDATA[关键字：使用WebSphereIntegrationDeveloper进行SOA开发<BR/><P><FONTface=Verdana>WebSphereIntegrationDeveloper指导教程——第2部分</FONT></P><P><FONTface=Verdana>作为本系列中第二篇文章，本文将介绍面向服务的体系结构(SOA)编程模型，并描述如何在WebSphere&reg;IntegrationDeveloper中创建简单的SOA应用程序。<BR/>摘自IBMWebSphere开发者技术期刊。</FONT></P><P><FONTface=Verdana>以面向服务的方式构建应用程序</FONT></P><P><FONTface=Verdana>在本系列的第1部分中，我们通过介绍IBM&reg;WebSphere&reg;IntegrationDeveloper及其附带的各种工具，为您提供了该产品的概况。在第二篇文章中，您将了解编程模型以及工具使用环境。为将此主题的各个方面结合起来进行讨论，我们将描述一个简单的应用程序并演示如何使用WebSphereIntegrationDeveloper构建该应用程序。</FONT></P><P><FONTface=Verdana>相信您一定已经听说过面向服务的体系结构(SOA)这一术语。但什么是SOA，以及更重要的问题，它对业务集成领域有什么好处？我们非常乐意回答您的问题。WebSphereIntegrationDeveloper应用程序是通过面向服务的体系结构进行实现的，因此我们首先讨论什么是SOA以及遵循这种体系结构模式对于我们的应用程序会有何好处。</FONT></P><P><FONTface=Verdana>理想情况下，您希望能重用现有的IT资产作为构件或组件来构建新的应用程序。每个构件都是一个服务，这意味着您可通过标准方法来访问服务而不必关注其具体实现及其位置。在SOA中，业务逻辑从基础结构中被分离出来，因此开发人员可以把精力集中在实现上，而无需关注如何访问服务。</P><P></P></FONT><P><FONTface=Verdana>简而言之，服务是一些黑盒，您并不关注其内部情况，只要它们能够按照所声明的情况进行工作。一旦您拥有这些黑盒，接下来的关键步骤就是将它们连接起来构成完整的应用程序。这些黑盒可以是Java&#8482;技术、业务流程执行语言(BPEL)、到遗留系统的连接或适配器以及到业务合作伙伴所提供的Web服务的连接。它们就是您的服务构造块。</FONT></P><P><FONTface=Verdana>服务通常是无状态的，这意味着您无需担心是否按特定顺序或在具体的上下文中调用它们。而且，您可能打算要合成业务合作伙伴的服务，并以访问您自己服务的方式来访问它们。您还可能需要合作伙伴能够访问您的服务。通过SOA，您可通过交换服务或调用新的所需服务，来方便地适应不断变化的业务环境。这使企业之间的业务交易变得更加方便。</FONT></P><P><FONTface=Verdana>访问服务的标准方式是什么？服务会发布其接口，这也是服务与调用方之间的协定。接口可通过某种语言进行定义，例如Web服务接口可通过Web服务定义语言（WebServicesDefinitionLanguage，WSDL）进行定义。接口中包含向服务传递数据或从服务获取数据的规范。接口并不指定如何实现服务以及用什么语言来实现服务。因此，您可能具有使用Java实现的服务，而该服务又调用另一个使用BPEL实现的服务。</FONT></P><P><FONTface=Verdana>所有这些都是一般性的概述，听起来不错，但我们需要深入探讨如何使用WebSphereIntegrationDeveloper来实现面向服务的体系结构。在上一篇文章中，我们讨论了服务实现的各种方式，但对服务如何协同工作方面未作详细介绍。本文将深入介绍服务交互的详细内容。</FONT></P><FONTface=Verdana><P>应用程序的构造块</P><P></P><P>构造块是一种比喻说法，这对于我们理解面向服务的体系结构非常有帮助。通常情况下，您会将这些构造块堆叠在一起以构建较大的应用程序，而后者又可作为另一种构造块。通过这种方式来分析服务，就能容易地掌握WebSphereIntegrationDeveloper中的服务组件体系结构（ServiceComponentArchitecture，SCA）编程模型。SCA是SOA的一个实现，而WebSphereIntegrationDeveloper是一个Workbench，利用其提供的工具，您不仅可以直观地将构造块组装成完整的解决方案，还可以构建每个构造块的内部工作。SCA标准化工作是ApacheTuscany开放源代码项目的一部分。在接下来的几部分中，将介绍关于使用服务组件体系结构对您要通过WebSphereIntegrationDeveloper构建的任何解决方案进行基础布局的基本知识。</P><P>模块</P><P>模块是服务的容器，它既是WebSphereIntegrationDeveloperWorkbench中的项目，也是WebSphereProcessServer上的部署单元。这意味着您构建的任何解决方案都将作为一个或多个模块部署到服务器上。对那些熟悉J2EE的开发人员而言，模块是作为企业归档(EAR)文件进行打包和部署的。服务组件体系结构的优点之一是您无需关注底层的打包工作。模块提供的服务既可被其他模块使用，也可由合作伙伴或客户通过外部客户端来进行访问。模块是组件、导入和导出的集合，我们将在以下几部分中进行介绍。</P><P></P><P>要创建模块，请在BusinessIntegration视图中右键单击并选择New-Module。系统将为您创建的模块生成新的组装图，您可使用组装编辑器来编辑此图。BusinessIntegration视图位于组装编辑器左侧（如果您没有移动该视图的话），其中显示所有项目构件。图1显示了新创建的模块。</P><P><BR/>图1.新模块</P><P><IMGsrc="/Image/20081121846366877801.jpg"border=0><BR/>组件</P><P>模块是一种较大的粗粒度构造块，后者由称为组件的较小的细粒度构造块构成，组件是实际服务模块的组成部分。在其内部是通过第一篇文章中所描述的实现类型之一进行实现的（我们将进行简单的概述）。例如，假设您具有一个订单处理模块。在该模块中，您可能具有一个用来更新库存信息系统的库存组件和另一个检查客户信用的组件。</P><P>您可在组装编辑器中创建组件，具体做法是在调色板上选择组件，然后将其放置在组装编辑器画布上。您还可在BusinessIntegration视图中将实现或接口拖到画布中以创建新的组件。这意味着您可通过自顶向下的方法先定义协定再定义实现来创建组件/服务，也可通过自底向上的方法在现有表面进行拖动来进行创建。</P><P></P><P>如果您只是在主界面中工作，并已从调色板中放置新的组件，它将显示在组装图中，如图2所示。蓝色感叹号表示实现尚未创建。在您创建组件时，您需要提供至少一个接口，这将在下一部分中讨论。记住，接口（协定）是其他服务所能看到或使用的内容，它们不会看到或关注您是如何实现服务/组件的。</P><P><BR/>图2.服务组件</P><P><IMGsrc="/Image/20081121846370877802.jpg"border=0></P><P></P><P><BR/>接口</P><P>对于使用服务组件的用户，所关注的是组件的接口，因为它规定了组件的使用方式。接口是有关组件操作的规范。操作是服务组件提供的业务功能或查询。例如，假设您具有一个EmployeeData组件，该组件提供员工信息查询服务。它可能只提供单个操作，如getEmployee，即您提供员工ID，它将返回该员工的资料。它还可能提供其他操作，如getRetiredEmployees或getCurrentEmployees，并返回员工资料集合。这些操作就是EmployeeData服务所提供的查询功能。</P><P>一个操作中包含输入、输出和错误。在员工示例中，getEmployee指定其输入为一个字符串，其输出为员工资料。其他两种操作可能无需任何输入（当然您可传递一些诸如限制条件之类的数据）而返回员工资料集合。接口可选择性地指定在服务调用期间出错时所引发的任何错误。例如，getEmployee可以定义为当内部机制无法定位具有某个ID的记录时引发InvalidEmployeeID错误。在某些情况下，操作可能不包含任何输入、输出或错误，例如操作只是简单地用来触发某个动作。</P><P></P><P>您可使用WSDL或Java来定义组件的接口。注意，在使用Java时，操作被称为方法，错误被称为异常。使用文本来创建WSDL接口无疑是非常繁琐的。WebSphereIntegrationDeveloper中提供了接口编辑器以简化组件接口创建过程，如图3所示。</P><P>有时，您可能需要调用外部服务（如Web服务），因此您还可以从合作伙伴处将现有的WSDL接口导入到工作区中。</P><P><BR/>图3.组件接口</P><P><IMGsrc="/Image/20081121846374877803.jpg"border=0><BR/>引用</P><P>因此，您需要声明您的服务组件将支持什么接口。不错，但是当您需要组件实现调用另外的服务该怎么做呢？那么，我们需要做两件事。首先，其他服务组件需要声明其自身接口，同时您自己的组件需要声明将调用什么接口。这样，当您将这些黑盒连接起来时，系统将能确保某种服务所需内容就是您正在连接的服务所提供的内容。现在，我们将介绍一些技术细节来使其更加清晰。</P><P></P><P>一个组件具有一个或多个引用。在您编写服务组件的实现时，切勿直接调用另外的服务组件，这样做会在您的代码中形成对其他组件的依赖关系。您的实现应该调用引用。引用具有名称，表示其他服务所最终具有的那些接口。最后，在您将黑盒连接在一起时，也会将引用连接到另外的黑盒上。很快，您的实现不仅知道使用哪些引用，而且不会依赖于任何特定的组件。在您组装模块时，您可完全灵活地组装可重用的部件，前提是其引用与目标组件的接口相匹配。</P><P>例如，图4显示了来自业务流程实现内部对TravelAgencyPartner引用的调用，图5显示了SimpleProcess组件中引用的定义和连线。因此，在对TravelAgencyPartner进行调用时，将使用连线另一端的服务。</P><P>在组装编辑器中，您可右键单击某个组件，并选择Add-Reference以添加新的引用。这将打开对话框并允许您为引用选择适当的接口。</P><P><BR/>图4.使用引用的服务调用</P><P><IMGsrc="/Image/20081121846378877804.jpg"border=0><BR/>图5.组件引用</P><P><IMGsrc="/Image/20081121846384977805.jpg"border=0><BR/>连线</P><P></P><P>在前面使用构造块比喻时，我们提到要堆叠构造块。更准确地说，在服务组件体系结构中，是使用连线来连接构造块。连线是指组装图中的连接，表示某个引用被连接到某个组件。例如，在图5中，SimpleProcess的TravelAgencyPartner引用被连线到TravelAgency组件。连线的源端的引用接口必须与目标组件的接口相符。连线的源端可以是一个导出，目标也可以是一个导入，这将在本文中的“导入和导出”部分进行介绍。</P><P>实现</P><P>服务组件的实现是执行服务功能的内部业务逻辑。记住，服务调用方并不知道服务的具体实现方式。事实上，它们甚至不知道是谁在提供此功能。如果您使用的是自顶向下方法，则当首先创建组件和接口之后，可在组装图中右键单击某个组件并选择GenerateImplementation来创建实现。您可从出现的子菜单中选择适当的实现类型，例如业务流程。您还可通过选择File-New，然后选择如业务对象、人员任务等实现类型来先创建实现。然后，您可将实现从BusinessIntegration视图拖到组装图中以自动创建组件。</P><P><BR/>表1.组件实现类型</P><P></P><P><BR/>实现类型目的<BR/>业务流程描述完成某些业务任务所需的一系列活动。它将协调整个任务中所包含的服务和子流程。<BR/>业务状态机事件驱动的业务流程，其中为应用程序的给定部分定义一系列的状态。根据所接收的外部事件，状态机将从某个有效状态转移到另一个有效状态。在状态转移时，它可执行任务或调用服务。<BR/>业务规则组根据一系列规则或决策表（部署后可动态更改）来捕获和实现业务策略以及实践。<BR/>人工任务由人工而不是程序完成的工作单元。<BR/>Java在比直观实现（如业务流程）更低的层次上描述业务逻辑。<BR/>选择器通过日期和时间来确定使用哪个组件。这是一种类型略微不同的组件，因为它不具有对其选定的组件的引用。组件及其使用时间将在选择器内部进行编码<BR/>映射接口映射负责从某个接口转换成另一个接口，业务对象映射将某个业务对象转换为另一个业务对象。</P><P>导入和导出</P><P>在某些时候，您将需要把某些模块的工作委派给另外的模块乃至合作伙伴的服务。问题在于，您只能在组装编辑器中对同一模块中的组件进行连线。解决方法是使用导入。导入与组件相同，但不具有实现。导入包含一个绑定，即有关如何连接到实际服务的信息。导入在此告诉您将前往模块外部并依赖其他位置的服务来完成工作。绑定可帮助识别其他服务的位置和内容。可使用以下绑定：</P><P>SCA，用于绑定到WebSphereIntegrationDeveloper组件</P><P></P><P><BR/>developerWorks:WebSphereBusinessIntegration专区</P><P><BR/>developerWorks:WebSphere开发工具专区</FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2692.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2692</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2692&amp;key=d2171988</trackback:ping></item><item><title>IBMWebSphere开发者技术期刊:使用服务组件体系结构构建SOA解决方案——第3部…</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2691.html</link><pubDate>Fri, 21 Nov 2008 08:51:14 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2691.html</guid><description><![CDATA[<P></P>关键字：导入和导出集成SCA模块<BR/><P><FONTface=Verdana>本文介绍如何使用服务组件体系结构（ServiceComponentArchitecture，SCA）和IBM&reg;WebSphere&reg;IntegrationDeveloper以各种组件为基础构建垂直集成解决方案。<BR/>引言</FONT></P><P><FONTface=Verdana>在本系列的第1部分，我们引入了服务组件体系结构作为编程模型来构建和组装集成解决方案，简要介绍了什么是SCA，以及一些相关术语的定义。在第2部分，我们讨论了引用和限定符，并说明了如何将各种组件连接到一起以创建SCA模块。在第3部分，我们将深入了解构建SCA模块的主要好处之一，即能以各种组件为基础垂直构建集成解决方案。</FONT></P><P><FONTface=Verdana>随着系统不断发展而变得更为复杂，有必要将各种解决方案进行水平集成；组织中的不同部门可能需要构建自己的解决方案并稍后将其集成到一起，或者可能不同的业务合作伙伴将需要通过Internet集成其解决方案。图1显示了一个此类水平集成的示例：</FONT></P><FONTface=Verdana><P><BR/>图1.集成系统</P><Palign=center><IMGsrc="/Image/200811218473261677801.gif"border=0></P><P><BR/>我们在第1部分中定义了SCA导入和导出，但我们将在本文中对其进行更为深入的研究，并继续构建我们的精简示例。具体来说，将重点讨论使用SCA绑定的SCA导入和导出。SCA绑定允许一个模块中的SCA组件使用SCA编程模型与另一个模块中的SCA组件通信。</P><P>在本文中，我们还将升级到IBMWebSphereIntegrationDeveloperV6.0.1，该版本允许构建特定的集成解决方案，以将IBMWebSphereProcessServerV6.0.1或IBMWebSphereEnterpriseServiceBusV6.0.1解决方案结合使用。在这个新版本中，我们还添加了对构建各种企业服务总线（EnterpriseServiceBus，ESB）中介的支持。（WebSphereESB运行时是WebSphereProcessServer的子集；有关更多信息，请参阅参考资料。）</P><P>导入与导出回顾</P><P></P><P>正如在第1部分中提到的，用于进行模块到模块和模块到外部服务调用的机制分别称为导入和导出。导入和导出是从模块角度而言，而模块是一个执行特定业务功能的自包含组件包：</P><P>当模块希望为其他实体（外部服务或其他模块）提供调用业务功能的能力时，它将导出此功能。导出还提供通过各种不同的传输协议提供此服务的能力。导出与模块内的特定组件关联。</P><P>当模块希望利用其他实体（外部服务或模块）的功能时，该模块将导入此功能。导入还提供通过各种传输协议与服务提供者交换的能力。</P><P>图2显示了一个使用导入和导出的SCA组装。该图表明，导出是外部的入口点，而导入则允许您调用模块外的功能。</P><P><BR/>图2.SCA导入和导出</P><Palign=center><IMGsrc="/Image/200811218473266677802.jpg"border=0></P><P><BR/>当通过导入和导入调用SCA组件时，参数将按值传递，即参数将从一个结构中复制到另一个结构。图3显示了两个彼此进行通信的SCA模块，并说明了SCA导入如何与SCA导出匹配。</P><P><BR/>图3.SCA导入和导出</P><Palign=center><IMGsrc="/Image/200811218473271677803.jpg"border=0></P><P><BR/>将SCA组件粘附到一起的连接机制抽象出了大部分基础结构级的代码。例如，可以将连接机制定义为同步或异步的，操作可以为单向的或为请求-响应型，或者可以定义组件间的事务处理行为。SCA将为您处理基础结构细节。</P><P></P><P>导入和导出可以与其他技术绑定，如JMS、EnterpriseJavaBeans(EJB)或Web服务，如图4所示。通过绑定到这些技术，可以通过使用SCA编程模型来让Web服务客户机调用SCA模块，或者让SCA模块调用现有EJB模块（由于EJB导入是由Java&#8482;接口定义的，所以使用EJB导入有一些限制；因此，BPEL之类——要求合作伙伴支持WSDL——无法调用EJB导入。详见后文）。</P><P><BR/>图4.与其他技术的导入与导出</P><Palign=center><IMGsrc="/Image/200811218473276677804.jpg"border=0></P><P></P><P></P><P><BR/>回页首<BR/></P><P></P><P>导入/导出绑定</P><P>面向服务的体系结构的一个关键在于能够公开采用大量绑定选项的服务，以及能够使用行业规范调用服务。正如所指出的，WebSphereProcessServer和WebSphereESB提供了一系列不同的绑定类型来帮助满足此类需求。绑定类型使用AssemblyEditor与导出和导入关联。目前有五种主要的绑定类型：</P><P>SCA——用于模块间的SCA调用的绑定类型。该绑定类型是配置最简单的类型，可提供模块间的无缝集成。</P><P></P><P>Web服务——可提供调用外部Web服务和将模块内的功能作为Web服务公开的功能。缺省情况下，Web服务将使用doc-lit包装样式，可以与HTTP和JMS协议一起使用。Web服务绑定功能是从基础WebSphereApplicationServer基本Web服务引擎派生的，受到相同的限制。</P><P>企业信息系统（EnterpriseInformationSystems，EIS）——提供通过WebSphereJCAAdapter集成到现有EIS系统的功能。此绑定类型的可用配置将根据目标不同而有所改变（SAP、JDBCAdapter等等）。企业数据发现服务通常与每个适配器一起提供，以帮助创建业务对象和导入与导出绑定。</P><P>JavaMessagingService——提供与使用JMS作为消息传递协议的端点进行集成的功能。在这种情况下，导入和导出使用数据绑定来帮助解析正确的业务对象/操作组合。</P><P>无状态会话Bean——提供使用Java接口与无状态会话Bean集成的功能。此功能只有在将Java引用连接到Java接口时才可用。在WebSphereIntegrationDeveloper中，使用WSDL引用的组件不允许连接到无状态会话Bean提供的Java接口。在此情况下，要求使用具有WSDL接口和Java引用的中间组件。</P><P>在本文中，我们将更深入地讨论SCA绑定的情况。本系列的后续文章将对其他导入/导出绑定进行更为深入的分析。</P><P></P><P></P><P></P><P><BR/>回页首<BR/></P><P></P><P>SCA绑定</P><P>SCA绑定提供了一致的方法来在WebSphereProcessServer或WebSphereESB环境中跨模块边界进行通信。将基于客户机模块使用的调用模式自动选择SCA绑定所使用的基础协议。</P><P>SCA提供四种调用模式。</P><P>同步——客户机发出请求，并等待响应。<BR/>异步单向——客户机发出请求，不等待响应。<BR/>异步延迟响应——客户机发出请求，客户机将在稍后请求响应。<BR/>异步回调——客户机发出请求，目标将调用使用响应调用客户机实现的服务。<BR/>WebSphereProcessServer或WebSphereESBSCA运行时将确定何时使用基础系统集成总线（对于异步调用模式）或RMI/IIOP（对于同步调用模式）。</P><P>SCA绑定是由导出驱动的。在SCA模块安装到WebSphereProcessServer的过程中，将创建必要的支持构件：</P><P>对于异步调用，将在SCA.SYSTEM.&lt;cellname&gt;.Bus中创建计算单元范围内的服务集成总线（ServiceIntegrationBus，SIBus）目的地。<BR/>对于同步通信，将创建一个指向模块会话Bean的计算单元范围内的名称空间绑定；模块会话Bean是无状态会话Bean，供模块用于各种目的，如作为工作边界、安全配置等的单元。<BR/>导入和导出文件一起工作，其中导入文件包含关于导出的重要信息，可帮助任意数量的客户机导入目标服务。</P><P></P><P>SCA运行时通过使用.import文件中的信息和调用模式（sync或async），可确定是使用SIBus目的地还是WebSphere名称空间绑定。</P><P>将创建一系列SIBus（请参阅参考资料）目的地来支持WebSphereProcessServer和WebSphereESB提供的各种异步调用类型；将为模块、组件、导入和导出创建目的地。每个目的地和转发路由路径将确保将消息路由到正确的目标服务。图5显示了SIBus目的地的一个示例。</P><P><BR/>图5.SIBus目的地</P><Palign=center><IMGsrc="/Image/200811218473280677805.jpg"border=0></P><P><BR/>此外，将为模块中的每个SCA导出创建一个名称空间绑定，如图6中所示。此绑定将在计算单元范围内创建，并遵循以下命名模式：</P><P>sca_ &lt;ModuleName&gt; _export_ &lt;ExportName&gt;。</P><P><BR/>图6.名称空间绑定</P><P></P><Palign=center><IMGsrc="/Image/200811218473284777806.jpg"border=0></P><P><BR/>在给定这两组构件范围的情况下，SCA导出绑定在整个计算单元内都可见。客户端模块和目标模块可以放置在计算单元内的任何WebSphereProcessServer或WebSphereESB服务器上，且仍然能够进行通信。</P><P></P><P></P><P><BR/>回页首<BR/></P><P></P><P>导出限定符</P><P>使用SCA绑定的导入是SCA组件在另一个模块中的逻辑表示。因此，可以采用与图7所示相同的方法在指向导出的引用上定义限定符。</P><P><BR/>图7.添加限定符</P><Palign=center><IMGsrc="/Image/200811218473288777807.jpg"border=0></P><P><BR/>导出并不包含任何限定符；相反，将要在导出的组件上放置限定符，详见第2部分中的说明。</P><P></P><P></P><P></P><P><BR/>回页首<BR/></P><P></P><P>库项目</P><P>跨越模块边界，必须考虑共享协定这一事实。应用程序通过接口进行通信，彼此传递数据对象。这意味着接口和业务对象应对模块可见，或位于与模块相同的位置。为了减少在每个模板中重复定义相同的接口和数据对象，WebSphereIntegrationDeveloper包括了一个特殊的SCA库模块，可以将其添加到SCA模块，就像JavaJAR文件可以为EAR文件中独立的JAR一样。（事实上，WebSphereIntegrationDeveloper就是这样处理库的。）这就允许您在单个位置中定义接口和业务对象，然后让所有模块对其进行共享。稍后我们将给出一个SCA库示例。</P><P>我们的示例应用程序</P><P></P><P>我们将继续使用在整个系列中使用的CreditApproval应用程序。在本文中，我们将演示如何通过将CreditHistory和CreditAgency模块外部化来使各个模块分离，以了解如何配置导出和导入。为了进行说明，我们还将演示如何在模块间共享SCA库。</P><P>为了运行此示例，您将需要正确安装WebSphereIntegrationDeveloperV6.0.1（该版本支持WebSphereESB）并在您的计算机上运行（请参阅参考资料），还要获取本文所附的下载材料，其中包含两个SCA模块（CreditAgency和CreditHistory模块）和一个具有共享接口及业务对象的SCA库。</P><P>设置工作区。</P><P>启动WebSphereIntegrationDeveloper。打开新工作区并关闭欢迎屏幕。</P><P>您将需要导入所下载的ProjectInterchange。为了导入ProjectInterchange，在BusinessIntegration视图内单击右键，然后选择Import，如图8所示。</P><P><BR/>图8.Eclipse导入向导</P><Palign=center><IMGsrc="/Image/200811218473292777808.jpg"border=0></P><P></P><P>我们将继续使用在整个系列中使用的CreditApproval应用程序。在本文中，我们将演示如何通过将CreditHistory和CreditAgency模块外部化来使各个模块分离，以了解如何配置导出和导入。为了进行说明，我们还将演示如何在模块间共享SCA库。</P><P>为了运行此示例，您将需要正确安装WebSphereIntegrationDeveloperV6.0.1（该版本支持WebSphereESB）并在您的计算机上运行（请参阅参考资料），还要获取本文所附的下载材料，其中包含两个SCA模块（CreditAgency和CreditHistory模块）和一个具有共享接口及业务对象的SCA库。</P><P>设置工作区。</P><P>启动WebSphereIntegrationDeveloper。打开新工作区并关闭欢迎屏幕。</P><P>您将需要导入所下载的ProjectInterchange。为了导入ProjectInterchange，在BusinessIntegration视图内单击右键，然后选择Import，如图8所示。</P><P><BR/>图8.Eclipse导入向导</P><Palign=center><IMGsrc="/Image/200811218473292777808.jpg"border=0></P><P></P><P><BR/>消息中介的实用介绍——第1部分消息中介基础</P><P><BR/>WebSphereProcessServer：IBM为SOA提供的新基础</P><P><BR/>IntroductiontoServiceDataObjects</P><P><BR/>SimplifiedDataAccesswithSDO</P><P><BR/>IBMWebSphere:DeploymentandAdvancedConfiguration</P><P></FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2691.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2691</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2691&amp;key=85e6c1a7</trackback:ping></item><item><title>指导教程——第1部分WebSphereIntegrationDeveloper概览</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2690.html</link><pubDate>Fri, 21 Nov 2008 08:51:14 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2690.html</guid><description><![CDATA[<P></P>关键字：WebSphereIntegrationDeveloper<BR/>本文是通过IBM&reg;WebSphere&reg;IntegrationDeveloper进行应用集成的面向服务的方法系列探索中的第一部分。本文对WebSphereIntegrationDeveloper及其主要组件和概念进行了概述。<BR/>摘自IBMWebSphere开发者技术期刊。<BR/><BR/>引言<BR/><BR/>本系列文章提供了通过WebSphereIntegrationDeveloper进行应用程序开发的指导教程。这第一篇文章对WebSphereIntegrationDeveloper及其主要概念进行了简要概述。<BR/><BR/>后续文章将会对每一个概念以及相关的构造工具进行深入的研究。我们将逐一介绍本产品中的每个领域，了解其功能及作用，最后您将有机会亲自构建整个应用程序的下一部分。以后的文章中涉及到的一些主题包括：<BR/><BR/>SOA开发<BR/>构建和组装简单应用程序<BR/>业务流程、状态机和规则<BR/>人工任务<BR/>EIS连接支持<BR/>中介和选择器<BR/>尽管这些文章之间是相辅相成的，但当深入研究到重要的某一特定部分时，会发现其实每篇文章自成一体。<BR/><P></P><BR/><BR/>什么是WebSphereIntegrationDeveloper？<BR/><BR/>您也许想知道什么是WebSphereIntegrationDeveloper，以及它为什么值得关注。现在的公司正面临着企业集成、系统自动化以及建立各种与客户沟通新渠道的日益紧迫的压力。公司需要灵活的、基于标准的产品和解决方案。<BR/><P></P><BR/>在集成活动的过程中通常会遇到一些问题，包括：<BR/><BR/>两个或更多异构的企业信息系统(EIS)之间的数据同步。<BR/>从使用者到多个生产者的智能代理产品请求。<BR/>向全球存储库发布产品数据，从而使得使用者能够访问并利用这些信息。发布工作的范围可以从创建可用产品的目录到参与全球在线市场。<BR/>使用拱型流程(overarchingprocess)协调多个现有的业务流程。<BR/>从订单接收到库存管理和供应链管理，对订单处理流程进行管理。<BR/>制定、审批和上报工作任务，从而高效地处理客户请求。<P></P><BR/>通过不断改变控制业务的规则和决策，动态地应对业务环境的变化。<BR/><BR/>WebSphereIntegrationDeveloper可以解决上述这些类型和其他类型的应用程序集成问题。就其基础而言，WebSphereIntegrationDeveloper建立在工业标准（尤其是WSDL、XSD、BPEL、Java&#8482;和UML）的基础上，同时也处于不断改进的标准的前沿（TuscanyServiceComponentArchitecture就是一个好的例子）。要在这些标准的基础之上构建应用程序，可以使用一系列可视化构造工具和更高层次的概念，后者将允许专注于解决业务问题，而不必去编写大量的J2EE代码或者做一个精通WSDL的专家。其实并不需要浸淫于这些标准之中，就能够实现它们。<BR/><BR/>从WebSphereIntegrationDeveloper的角度来看，面向服务的体系结构是指可以把精力集中于系统中的关键组件、可视化地构建它们、可视化地建立它们之间的联系，然后结束工作并使用WebSphereProcessServer来运行该系统。此后，还可以进行可视化的单元测试以及调试整个应用程序或者其中的单个部分。<P></P><BR/><BR/>WebSphereIntegrationDeveloper支持自顶向下、自底向上和中间相遇三种构造方法。可以从顶层，即设计层开始，布置整体构想，然后逐渐地深入并实现各个部件（服务）。或者，可以采取自底向上的方式，分别实现这些服务，然后将它们组合成更大的应用程序。更有可能的是，可以使用中间相遇的开发方法，也许首先布置初始的高层次设计，然后使用EnterpriseMetadataDiscovery工具来研究企业信息系统，并且定义各种与之相连的服务。可能还想引入并重用业务合作伙伴所提供的外部Web服务。<BR/><BR/><BR/>谁在使用WebSphereIntegrationDeveloper？<P></P><BR/><BR/>也许我们真正应该问的是，WebSphereIntegrationDeveloper的用户究竟担任什么样的角色，还有在整个开发过程中，用户什么时候使用这些工具呢？<BR/><BR/>WebSphereIntegrationDeveloper面向集成专家。这些用户并不是Java、WSDL或者XSD专家。他们专注于集成应用程序以及解决前面讨论过的各类问题，当然，他们希望这些工作尽可能的简单。图1显示了集成专家与其他用户角色的技术集合之间的关系。<BR/><BR/><BR/>图1.WebSphereIntegrationDeveloper用户<BR/><BR/><IMGsrc="/Image/20081121846678377801.gif"border=0><BR/><BR/>应用程序的开发过程在不同的开发阶段涉及到许多用户角色。需要注意的是，我们提到的角色指的是做某项工作所涉及到的能力，而一个公司中的某个人实际上可能同时担任多个角色。图2显示了软件开发过程中通常需要集成专家参与的部分。集成专家从业务分析人员手中接过任务，开发集成应用程序，对其进行测试和调试，最后在通过了所有的测试并完成了集成任务后，将其部署到产品服务器。<BR/><BR/><BR/>图2.集成专家在开发中参与的工作<BR/><BR/><IMGsrc="/Image/20081121846683377802.gif"border=0><P></P><BR/>教程<BR/><BR/>现在是做好准备并开始学习关于WebSphereIntegrationDeveloper的基本概念和工具的教程的时候了。在后续的文章中，我们将关注各种元素的重要性和价值，并说明在构建示例应用程序的过程中如何使用这些概念或工具。现在，我们先对各个部分做一个快速的浏览。<BR/><BR/>选择路线——服务实现类型<BR/>业务流程<BR/>业务状态机<BR/>业务规则和决策表<BR/>选择器<BR/>接口映射和业务对象映射<BR/>人工任务<BR/>Web服务<BR/>企业信息系统服务<BR/>Java/EJB——针对Java爱好者<BR/>重要的里程碑——业务对象<BR/>关系<BR/>可视代码段<BR/>中介服务<BR/>将其组合在一起<BR/>模块和组件<BR/>组装关系图<BR/><BR/><BR/>选择路线——服务实现类型<P></P><BR/><BR/>服务是面向服务的体系结构中的主要构造块。WebSphereIntegrationDeveloper包括一套丰富的服务构建工具，它们能够解决各种可能碰到的问题。在大多数情况下，可以通过可视化的构造工具，使用前面提到的几种服务实现类型来构建服务，有了这些构造工具，在使用WebSphereIntegrationDeveloper开发应用程序时，并不要求是一个专家程序员。除了Java或者EJB服务之外，大部分服务可以通过可视化构造工具来构建。可以使用这些Java和EJB服务来利用现有的Java应用程序，或者，如果您的组织中有一些Java狂热爱好者，可以使用IBMRational&reg;ApplicationDeveloper来构建Java服务（请参阅想进一步了解相关产品吗？）。<BR/><BR/>可以使用各种编程模式来实现服务，从业务过程流方式的BPEL流程，到状态机方式的事件管理，以及到声明性业务规则方式。.对某种模式的熟悉程度和问题的本质将决定所选择的实现方式。比如，有些问题使用状态机比使用声明性规则具有更加简洁的表述。让我们了解一下这些不同的服务类型，并讨论在不同的情况下应该如何选择更好的服务类型。<BR/><BR/>业务流程<BR/><BR/>业务流程为协调企业服务和描述业务逻辑提供了基本的手段。业务流程由一系列按照指定顺序执行的（串行或并行）活动或步骤组成。业务流程编辑器是让您能够依据BPEL标准快速地编辑业务流程的可视化构造工具。<BR/><BR/>业务流程本身也是一个服务。可以使用它来协调可重用的子流程或者其他具有不同实现类型的服务。业务流程的一个重要特点是其长期性和与人的交互性。流程的生命期可能非常短，在高度自动化的系统中这种情况很常见。流程也有可能运行非常长的时间，也许几天甚至几个月，并等待人类用户完成某项与活动相关联的特定工作之后才能继续运行。例如，业务流程可能需要耐心地等待管理人员批准一项旅行请求。<BR/><BR/>图3展示了如何使用业务流程编辑器来构造简单的旅行登记业务流程。<P></P><BR/><BR/><BR/>图3.业务流程编辑器<BR/><IMGsrc="/Image/20081121846688377803.jpg"border=0><BR/><BR/>业务状态机<BR/><BR/>业务状态机是事件驱动的业务事务，该业务事务定义了应用软件中给定部分的一组状态。状态机根据接收到的外部事件从一个有效状态转移到下一个有效状态。对于一个给定事件，使用各种条件来决定新的有效状态。售货机可以作为一个简单的例子，当它接收到足够的钱则转换到激活选择按钮的状态。在做出选择之后，它就转变到分发商品（比如说一个巧克力棒）的状态。可以使用状态机编辑器来构造业务状态机，它与业务流程编辑器一样是可视化的编辑工具，并且几乎不需要具有Java编程经验。<BR/><BR/>可以使用业务状态机和业务流程来协调应用程序的各个部分。二者之间有一些细微的差别，这使得它们在解决某些类型的问题时各有所长。状态机非常适合于循环模式或者那些能自然地想到一组有效状态的情况。这一点非常重要，因为在状态机中，实际在一个状态中并不进行任何动作，而仅仅是等待转移到下一个状态的信号并随后发生状态转移。当状态机从一个状态转移到另一个状态的过程中，它可以完成一些工作，比如售货机的例子中将巧克力棒分发给顾客。与之相反，业务流程则是在其活动中完成工作。它们非常适合于顺序执行或者并发执行的任务。与业务流程相似，业务状态机能够调用其他实现类型的服务，并且能够将自身作为服务来调用。图4显示了使用业务状态机编辑器所构造的业务状态机<BR/><BR/><BR/>图4.业务状态机编辑器<BR/><BR/><IMGsrc="/Image/20081121846692377804.jpg"border=0><P></P><BR/>developerWorks:WebSphere开发工具专区<BR/><BR/><BR/><BR/>获得产品和技术<BR/><BR/>下载WebSphereBusinessModeler试用版<BR/><BR/><BR/>下载RationalApplicationDeveloper试用版 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2690.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2690</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2690&amp;key=d0f1608c</trackback:ping></item><item><title>ClearCase远程客户端实现功能详述（一）对CQ集成的支持与版本树</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2689.html</link><pubDate>Fri, 21 Nov 2008 08:51:04 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2689.html</guid><description><![CDATA[关键字：CQ集成ClearCase<BR/><P><FONTface=Verdana>1．配置管理工具ClearCase与缺陷管理工具ClearQuest的集成</FONT></P><P><FONTface=Verdana>1.1集成概述</FONT></P><P><FONTface=Verdana>使用ClearQuest作为缺陷管理工具，并将ClearCase和ClearQuest进行集成，从而将变更请求和配置管理对象有机的联系到一起。这样所有的Activity可以通过ClearQuest获得。用户可直接管理需修改的程序模块，掌握软件变更状况。CC与CQ集成后，可以提供给用户软件某一版本曾经完成哪些变更的信息；某一个的功能增加共修改了哪些模块；在变更频繁的环境下，可以管理、跟踪及恢复任何的变更；查询变更需求实际修改了哪些程序模块；</FONT></P><P><FONTface=Verdana>1.2集成分类</FONT></P><P><FONTface=Verdana>ClearQuest和ClearCase集成，主要的集成方式有以下两种：</FONT></P><P><FONTface=Verdana>1)ClearQuest与BaseClearCase集成</FONT></P><P><FONTface=Verdana>集成是通过将ClearCase的版本对象库（VOB）与ClearQuest的数据库相关联来实现的，集成后开发人员在修改代码（CheckOut）时会自动弹出ClearQuest的变更请求列表，并强制开发人员将此次修改与特定的变更请求相关联。这样一来，开发人员在代码提交时可以清楚的知道哪些修改过的代码是对应哪些任务的，集成人员可以准确的了解到某次建立到底集成进来哪些变更请求。项目经理可以轻松的定位变更请求和哪些改动相关。</P><P></P></FONT><P><FONTface=Verdana>2)ClearQuest与UCMClearCase集成</FONT></P><P><FONTface=Verdana>此种集成方式与上一种集成方式从实现机制上没有本质的区别，但从功能上二者的集成更加紧密，且很多功能更加自动化。如开发人员在提交代码时系统会自动检测出此次需要提交的变更请求，待开发人员确认后系统会自动对代码进行归并。总而言之，UCM对于开发人员来讲使用非常简便且不要出错，对于集成人员来讲，由于UCM采用组建式管理，使得系统架构更加清晰，集成工作更加快捷。对于项目经理来讲UCM为团队提供了一套完整且高效的变更管理流程。</FONT></P><FONTface=Verdana><P>2．CCRC对ClearQuest与UCMClearCase集成的支持</P><P>2.1ClearCase远程客户端软件增强性的功能概述</P><P>新版本的CCRC对集成了ClearQuest的环境支持程度大大提高，本文介绍的特点与功能都是针对最新ClearCase版本上，ClearCase远程客户端所能实现的所有功能而言。读者可能因为自己的ClearCase版本的不够新而与本文所述部分内容不符。希望本文对ClearCase这些新特点，新功能的介绍，对您将来的工作与应用起到一点帮助。</P><P></P><P>一个关联了CQ的CCRC服务器，表示该服务器上有一个或多个项目，建立了与ClearQuest之间的关联关系。当一个CCRC客户端连接到该服务器上并加入该关联项目，那么有关于该项目的所有活动与变更将被ClearQuest来进行存储和管理。</P><P>2.2CCRCServer的两种配置模式及其模式特点</P><P>2.2.1集成了ClearQuest的服务器（非Web）</P><P>该集成模式是CCRC较早些版本中能够实现的功能。在这种模式下，ClearQuest主要通过以下行为来管理所有的活动和变更请求。</P><P></P><P>在客户端进行检入，检出或加入资源管理的动作时，用户点击了Browser按钮，随之显示的是属于该用户的所有ClearQuest活动记录列表；<BR/>在用户选择了其中一个活动作为当前工作活动，则该活动在ClearQuest的状态自动转化为"Active"状态；同时，该活动与ClearCase的一个UCM活动建立关联关系。<BR/>在ClearQuest中活动的转化过程，如果有某些必须的域内容缺失，那么自动转换过程不会成功结束，用户会收到错误提示，并且该转化过程被中断；为了完成该转化，用户需要从ClearQuest客户端登陆进CQ,找到该活动记录，补上所缺域内容并保存修改记录。再次进行活动转化，此时可以成功完成。<BR/>对于建立了与CQ关联的项目，用户可以定制该项目的集成规则，如下图所示：如果选择了"TransitiontoCompleteafterDelivery",那么在用户结束"交付"动作时,CQ会自动将与该"交付"动作关联的CQ活动状态标志为"完成"；<BR/>如果用户定制了"TransitionedtoCOMPLETEafterChangingActivity"，显然，用户在完成一个活动后，会在CQ中被标志为"完成"状态；<BR/>CQ配置项，如下图所示：</P><P><IMGsrc="/Image/200811218473555077801.jpg"border=0></P><P></P><P><BR/>非Web集成模式的图示如下：</P><P></P><P><IMGsrc="/Image/200811218473560177802.gif"border=0><BR/>2.2.2集成了ClearQuestWeb的服务器</P><P>CCRC新版本增加了对CQWeb的支持，使得CCRC客户端更具有易用性和灵活性。对于用户来说，更能方便的操作和使用ClearCase。</P><P>与集成非Web模式相比而言最大的区别就是：在非Web模式的某些活动因为某些强制填充域内容缺失，而被终止的情况下，换作Web模式，该活动可以继续。解决方法就是，在自动转换过程中，调用系统的浏览器，用当前的用户登陆到服务器的cqweb上，以Web形式打开CQ管理的，与当前行为关联的那个活动记录；为用户提供这样一个便捷的方法来补足那些缺失内容的域，进而完成当前行为。特别的，缺失内容的域名称会用鲜明的红色来标示，指引用户能够快速而准确的补充所需内容。<BR/>Web集成模式的图示如下：<IMGsrc="/Image/200811218473564177803.gif"border=0></P><P></P><P>3.集成了CQ的CCRC服务器的配置</P><P>根据实际的不同情况，CCRC客户端，CCRC服务器，CQ服务器，CQWeb和CQWebApplication在各个机器上的部署情况是多种多样的，关于CCRC服务器的部署，在本文中暂不作详细介绍。在这个例子中，我们以Web模式的一个配置为例：</P><P>CCRC服务器/CQ服务器：linux</P><P>CCRC客户端：windows</P><P>准备工作：</P><P>在Linux平台上安装CC,CQ产品，其中需要强调的必须安装的组件：CCWeb组件；因为要配置集成CQWeb的模式，还需要再安装CQWebApplication.<BR/>在windows平台安装CCRC客户端，另外需要安装ClearQuest。这是因为Linux平台不支持cqmaintenance和cqdesigner工具的GUI界面。当用户需要定制自己的defect表单，需要一台安装了CQ的windows平台来做这些工作。<BR/>在CQ后台数据库中创建至少2个数据库实例，用作CQ的用户数据库和模式数据库。</P><P></P><P><BR/>3.1配置Web参数</P><P>Web模式的关键在于CCRC服务器上ccweb.conf文件，该文件体现了CCRC和CQWeb之间的集成关系。在CCRC服务器&lt;CCHome&gt;\config\ccweb\目录下，将ccweb.conf文件拷贝至&lt;CCHome&gt;\var\config(Windows)或/var/adm/rational/clearcase/config(Unix)，所做的编辑工作都在这个拷贝副本上进行。</P><P>-cqweb_url参数。该参数是否设置决定了集成是web还是非web模式。该参数指向的地址为CQWebApp所在位置。具体形式：http://&lt;cqwebserver&gt;/cqweb</P><P>-cqweb_browser_timeout:该参数表示客户端如果一直不关掉浏览器窗口，CCRC服务器的等待时间。该参数的默认值为30分钟。</P><P>-cqweb_autologin:表示每次打开CQWeb是否为用户自动登录。默认值为true,会自动为用户登录CQ.用户也可以改为false,以增强安全级别。</P><P>3.2在windows平台创建CQ模式库和用户数据库</P><P></P><P>打开CQMaintenance工具，选择"模式库-〉创建"，为该模式库命名；</P><P>选择数据库类型，依次填入服务器，数据库，用户名，密码，连接选项；这些项目的具体含义这里就不赘述，可以参考CQ用户使用手册来获得相关信息。</P><P>模式库成功创建后，如图所示：</P><P><IMGsrc="/Image/200811218473569177804.jpg"border=0></P><P><BR/>接着，打开CQDesigner工具，来编辑模式文档。举例来说，我们选择"记录类型-〉Defect-〉字段"，添加一个SHORT_STRING类型的字段，命名为"SQUIDWARD"。在"记录类型-〉Defect-&gt;状态和操作-〉行为"中，将该字段的"opened"属性设置为"Mandatory"参数。打开"表单-〉Defect_Base"一项，通过添加选项卡，将我们创建的"SQUIDWARD"域拖入该选项卡。至此，模式的简单编辑就算完成了。将该模式检入并基于此模式，生成一个用户数据库。</P><P>3.3在CQ服务器上创建连接到该模式库的数据库集和连接</P><P>执行此步骤的意义在于，令ClearCase服务器上的项目能够找到所要集成的ClearQuest数据库信息。</P><P></P><P>在Linux平台上，ClearQuest的安装目录下，执行clearquest命令，启动clearquestGUI.</P><P>打开"文件-〉数据库-〉管理连接"，选择"添加数据库集"，相当于把在windows上创建模式库的过程重复了一遍，模式库的名字可以重新命名，它只是一个在CCRC上对CQ数据库注册的一个标示。添加成功后的数据库集显示在"可用的数据库集"一栏中，这还不够，还需要创建一个连接来登录该数据库，选"添加连接…."按钮。在弹出的对话框中，输入一个登录该数据库的用户名，该名称将被用于以后在集成环境中，再次登陆CQ数据库的登录名称。下图表示在Linux服务器上创建好了的数据库集与连接列表。可以创建多个数据库集，每个数据库集可以对应多个以不同用户登录的连接。</P><P><IMGsrc="/Image/200811218473573177805.jpg"border=0></P><P></P><P><BR/>3.4在CCRC服务器上实现CQ与UCMClearCase的集成设置</P><P>前面的环境都搭建成功的话，这一步可以说水到渠成，非常容易。将CC的项目与CQ集成，既可以在创建项目初期，也可以对一个既有项目进行集成配置。</P><P>新建项目时，与CQ进行集成。创建项目的最后一步，将默认选项改为yes,在CCRC服务器上注册的CQ数据库信息将被搜索到并显示在下拉列表中。该信息的物理存储位置在&lt;CQ_Home&gt;/CQDB_rgys/目录下，当在CCRC服务器上生成一个数据库模式，就会在该目录下添加一条记录信息。</P><P><IMGsrc="/Image/200811218473578177806.jpg"border=0></P><P><BR/>对一个已有项目进行与CQ的集成打开CCProjectsExplorer,选择要集成的项目，右键单击，选择"属性"，打开ClearQuest页，勾上"ProjectisClearQuest-enabled"选项，选择需要的CQ连接就可以了。</P><P><IMGsrc="/Image/200811218473583177807.jpg"border=0><IMGsrc="/Image/200811218473588177808.jpg"border=0></P><P></P><P>在进入Desinger的时候，如果MaintenanceTool中有多个模式库，必须选择一个SchemaRepository才能进入Desinger，此时在Desinger中设计的所有Schema都附属于此登陆的SchemaRepository，并且所有Schema信息都储存于对应的数据库中。</FONT></P> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2689.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2689</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2689&amp;key=a3da1f35</trackback:ping></item><item><title>ClearCase远程客户端实现功能详述（二）对CQ集成的支持与交付/同步</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2688.html</link><pubDate>Fri, 21 Nov 2008 08:51:02 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2688.html</guid><description><![CDATA[<H1><FONTsize=2>关键字：CQ集成</FONT><BR/><FONTface=Verdana><P><BR/><FONTsize=2>引言</FONT></P><P><FONTsize=2>绑定活动与非绑定活动</FONT></P><P><FONTsize=2>之所以先介绍这个概念，是因为在后边的介绍中，很多地方会用到相关的概念。在这里先大概做个介绍。和UCMCC集成的CQ数据库中，对于已存在的从属于某个用户的活动记录，称作对于该用户的非绑定的活动。当用户执行了加入源控制或检出的操作时，系统会提示用户从CQ数据库中选定一个活动记录来和该次操作关联，这样，被选定的活动记录就成为了绑定的活动，它会表现出一个CC活动的一切特征。</FONT></P><P><FONTsize=2>在CC与CQ集成的环境下，CCRC客户端的应用</FONT></P><P><FONTsize=2>1．在客户端浏览CQ数据库中的Defect纪录</FONT></P><P><FONTsize=2>在ＣＣＲＣ服务器端将项目和ＣＱ绑定后，从ＣＣＲＣ客户端点击加入该项目。具体操作过程参见《ClearCase远程客户端介绍》中"创建UCM视图"一节。在视图创建的最后一步，完成与CQ的集成设置。参见《ClearCase远程客户端实现功能详述（一）》中"在CCRC服务器上实现CQ与UCMClearCase的集成设置"一节。</FONT></P><P><FONTsize=2>至此，用户可以开始方便而美妙的UCMCC与CQ集成环境的应用了。</P><P></P></FONT><P><FONTsize=2>1.1从CCRC客户端登陆CQ数据库</FONT></P><P><FONTsize=2>用户第一次连接CCRC服务器，在绑定了CQ的项目的流视图下，点击"我的活动"，系统会出现一个CQ的登陆窗口。如图1所示：</FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472791977801.jpg"border=0><BR/>图1</FONT></P><P><BR/><FONTsize=2>用户需要输入CQ数据库的相应用户名和密码。在不断开和CCRC服务器的连接的前提下，再次点击"我的活动"，将不会出现该对话框，登陆信息会存储在这个连接会话的缓存里。这里我们用admin用户登录。</FONT></P><P><FONTsize=2>引申一下，如果需要用另一个用户来登录CQ数据库，再次调出该窗口的方法就是手动断开与CCRC的连接，重新连接，然后点击"我的活动"。</FONT></P><P><FONTsize=2>1.2察看活动记录详细信息</P><P></P></FONT><P><FONTsize=2>通过CQ用户验证后，在ClearCase详细信息窗口中，会显示出一个Defect的列表。它们是已经存在于CQ数据库中的属于该用户admin并且状态为Assign的所有Defect以及属于该用户的，和当前流绑定的状态为open的所有活动。</FONT></P><P><FONTsize=2>任意选择一个defect,右键点击并选择"属性"，一个属性窗口打开。如图2所示：</FONT></P><P><FONTsize=2>注意该窗口中目前只有"常规"和"ClearQuest"两个tab页。这个defect可以称为未绑定的活动。它是CQ数据库中一条普通的Defect记录。仅仅是因为该数据库和CC的某个项目绑定，所以在该项目下的一个UCM视图中被显示出来。</FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472796077802.jpg"border=0></P><P></P><P><BR/>图2</FONT></P><P><BR/><FONTsize=2>用户还可以以Web形式在客户端就浏览这条记录的详细信息。选择"ClearQuest"页并点击按钮"显示ClearQuest记录"。如图3所示。注意，如果用户在安装过程中，没有正确设置"cqweb_url"参数，该按钮将不会显示。参见《ClearCase远程客户端实现功能详述（一）》中"配置Web参数"一节。</FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472799077803.jpg"border=0><BR/>图3</FONT></P><P><BR/><FONTsize=2>点击"显示ClearQuest记录"后，一个标题为"RationalClearQuest"的窗口出现了。该窗口调用了客户端的默认浏览器，以web的形式来显示CQ数据库中的记录。如图4所示。如果该窗口未能正确显示记录内容，有以下几种检验方法是用户应该注意的：</FONT></P><P><FONTsize=2>1．服务器的防火墙设置是否为http协议留了出口；</P><P></P></FONT><P><FONTsize=2>2．服务器上的CQWeb服务是否起来。对于CQ服务器在windows的情况，打开控制面板-〉服务，找到"IBMHTTPServer6.0"手工启动；如果服务器在linux或unix上，到&lt;CQHome&gt;/common/rwp/bin/目录下,运行rwp_restart.</FONT></P><P><FONTsize=2><IMGsrc="/Image/20081121847282077804.jpg"border=0><BR/>图4</FONT></P><P><BR/><FONTsize=2>再次打开，用户就看到了熟悉的在CQWeb里出现的内容了。</FONT></P><P><FONTsize=2>2．检入，检出，交付等行为在CCRCSQUIDWARD环境下的操作与表现</FONT></P><P><FONTsize=2>首先要说明的是，加入源控制，检出，检入和"处理活动"行为都可以把一个未绑定的defect转变成一个绑定了的活动。</FONT></P><P><FONTsize=2>2.1加入源控制操作。</P><P></P></FONT><P><FONTsize=2>选择一个本地私有文件，点击工具栏按钮，出现"将资源添加到源控制"窗口，如图5所示：因为是在UCM下进行加入资源控制操作，所以必须和一个活动关联。特别提出的一点，该界面上的新建按钮是无效的。也就是说，通过CCRC客户端向CQ数据库中添加一条新的记录是不行的。只能通过"浏览"来显示已存在的活动记录，从中选取一条进行关联。</FONT></P><P><BR/><FONTsize=2>图5</FONT></P><P><BR/><FONTsize=2>点击"浏览"按钮，出现的"选择活动"窗口如图6所示：</FONT></P><P><FONTsize=2><IMGsrc="/Image/20081121847285077805.jpg"border=0><BR/>图6</FONT></P><P><BR/><FONTsize=2>选择活动"SCDB1_Defect4"，确定之后，会有一个"将资源添加到源控制"的进度条显示具体进度。成功后，再回到"我的活动"，选择"SCDB1_Defect4"的属性，我们看到了和图2相比，此时，该活动的属性多了3个Tab页：分别是"变更集"，"定制"和"锁定"。</P><P></P></FONT><P><FONTsize=2><IMGsrc="/Image/20081121847288077806.jpg"border=0><BR/>图7</FONT></P><P><BR/><FONTsize=2>这时，一个CQ数据库中的记录被成功绑定为一个CC的活动。它具有一个CC活动的所有特征。通过察看该记录的"统一变更管理"项，可以了解更详细的绑定信息：比如该记录所绑定的CC项目，所从属的流和视图。如图8所示。点击"ViewChangeSet",还可以浏览所有和该活动相关的变更集。</FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472811077807.jpg"border=0><BR/>图8</FONT></P><P></P><P><BR/><FONTsize=2>2.2处理活动和完成活动</FONT></P><P><FONTsize=2>处理活动和加入源控制的结果类似，都是将一个CQ数据库中的独立的Defect与一个具体的CC活动绑定起来。唯一的不同之处在于，这样处理的绑定活动暂时没有属于它的变更集。在之后的检出检入过程中，关联了该活动之后，它才拥有自己的变更集。</FONT></P><P><FONTsize=2>选择要关联的Defect,右键单击，选择"处理活动"。如下图所示：</FONT></P><P><FONTsize=2></FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472814077808.jpg"border=0><BR/>需要特别说明的是，作完处理活动后，该活动只对当前流可见。也就是说，在并行的其他开发流或集成流上，是看不到这个open状态的活动的。也不可以把一个流上open状态的defect转到另一条流上。</FONT></P><P><FONTsize=2>完成活动选项可以将检出的元素执行检入，并且自身状态也变为resolved或completed。当然，是针对和该活动关联的元素。比如，在checkout一个元素时，关联defect1,然后选择defect1并点击"完成活动"，该元素的检入过程就被激发了。完成活动之后，活动状态变成"resolved".另外要提醒的一点，如果没有设置项目的policy,完成活动是不能进行的。Policy的设置参考《ClearCase远程客户端实现功能详述（一）》"CCRCServer的两种配置模式及其模式特点"一节。</FONT></P><P><FONTsize=2>2.3交付与同步</P><P></P></FONT><P><FONTsize=2>UCMClearCase的一个特点是多条开发流并行开发，交付与同步是这种开发模式的保证。</FONT></P><P><FONTsize=2>当用户在一条开发流上进行了一些改动，并想把这些变更交付到集成流上的时候，在CCRC客户端完成这个操作是非常简单的。可以参考本文后半部分关于"交付/同步的操作"。</FONT></P><P><FONTsize=2>由于本例关联了CQ,这里讨论一下和没有关联CQ的交付/同步操作的区别。</FONT></P><P><FONTsize=2>要强调的是关联活动的状态会产生变化。根据我们在环境设置里的要求，我们可以要求完成交付后活动状态改为"完成"。即点选项目policy里的项："TransitiontoCompleteafterDelivery"。所以，当交付动作完成时，系统会依次调出与这次交付相关的所有活动详细信息，以Web的形式展示给用户，红色字体提示用户在"解决方案"一栏中输入相关信息以保证活动的状态能成功的转变为"完成"。如图9所示：这样，在CQ集成环境下的一次交付算是完成了。</FONT></P><P><FONTsize=2><IMGsrc="/Image/200811218472817077809.jpg"border=0><BR/>图9</FONT></P><P></P><P><BR/><FONTsize=2>3．ClearCaseUCM活动视图</FONT></P><P><FONTsize=2>到这里，用户已经很熟悉点击"我的活动"带来的种种方便了。我们还要介绍一个类似功能的视图：ClearCaseUCM活动视图。</FONT></P><P><FONTsize=2>首先，通过右键"我的活动"-〉UCM-〉显示UCM活动打开ClearCaseUCM活动视图。</FONT></P><P><FONTsize=2><IMGsrc="/Image/2008112184728210778010.jpg"border=0></FONT></P><P><BR/><FONTsize=2>打开树形结构，可以看到跟每个活动关联的元素和版本信息。还可以调整每个活动下关联的元素。右键点击元素，选择"移至活动"。可以将本变更记录移至另外一个与该视图关联的活动记录下。极大的方便了开发人员的操作。</FONT></P><P><FONTsize=2></FONT></P><P><FONTsize=2><IMGsrc="/Image/2008112184728260778011.jpg"border=0><BR/>这个视图对于察看和当前开发流关联的所有活动以及察看某活动下的变更集是很有用处而且方便的。</FONT></P><P><FONTsize=2>4．集成环境下的操作总结</P><P></P></FONT><P><FONTsize=2>CCRC实现了异地同步开发。其中交付/同步是实现这个目标的关键操作步骤。使用者在各自私有的开发流上进行工作，相互之间保持一定的独立性，当个自的变更任务完成之后，将变更结果从开发流交付到共享的集成流。当变更之后的集成流逐渐稳定之后，集成人员在集成流上创建基线，并根据实际情况将最新的基线设置为推荐基线。之后，各个使用者通过同步操作，将对应的开发流的基线同集成流的推荐基线保持一致，从而使各个使用者在同一基础上进行变更。</FONT></P><P><FONTsize=2>参考资料</FONT></P><P><FONTsize=2>ClearCase远程客户端介绍<BR/>ClearCase远程客户端实现功能详述（一）<BR/>CCRC帮助文档</FONT></P></FONT></H1> 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2688.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2688</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2688&amp;key=004148c0</trackback:ping></item><item><title>脚本测试的经验总结</title><author>a@b.com (naruYrY0Xa)</author><link>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2687.html</link><pubDate>Fri, 21 Nov 2008 08:51:01 +0800</pubDate><guid>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2687.html</guid><description><![CDATA[这里说的脚本既包括软件中文件处理的脚本，也包括存储过程，总之，它是从上游取得数据经过一番处理后交给下游来处理或者存储，通常每条数据又包括多个字段。<BR/>1通常一个脚本只完成一两个功能，需求会写的比较简单，但测试人员一定要仔细想像整个脚本执行过程的每个细节，以此来明确需求并设计测试用例，你想的有多细致通常可以决定测试有多充分。<BR/>2要对数据流中每个字段进行测试，这一点通常容易被忽略。比如有一个字段只能取值0或者1，这时就要设计两条数据分别取值0和1，如果有个字段要求取值整数，则只需随机取一个整数，再加上边界值的情况进行测试。<BR/>3要考虑各个字段为0为空或超长等特殊情况。<BR/>4要适当地考虑异常的情况，不要去测试不可能出现的异常。比如一个字段存储的是手机号，如果上游已可以保证手机号不为空，而且只为数字，就不用设计手机号为空和字符等异常的用例。通常最大的困难是确定那些异常是可能出现的哪些是不可能出现的，这通常需要开发人员的支持。<BR/>5处理过程的log也需要测试。<BR/>6最后可以通过查看脚本代码来发现一些问题。 出处:<ahref="http://www.testage.net/"target="_blank">软件测试时代</a><ahref="http://www.testage.net/"target="_blank">http://www.testage.net/</a>]]></description><category>软件测试</category><comments>http://www.icdoor.com/z-blog/post/cat_11/2008/11/21/2687.html#comment</comments><wfw:comment>http://www.icdoor.com/z-blog/</wfw:comment><wfw:commentRss>http://www.icdoor.com/z-blog/feed.asp?cmt=2687</wfw:commentRss><trackback:ping>http://www.icdoor.com/z-blog/cmd.asp?act=tb&amp;id=2687&amp;key=b4f9569d</trackback:ping></item></channel></rss>
