﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><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>BlogJava-常高伟的专栏-随笔分类-微内核流程引擎</title><link>http://www.blogjava.net/chgaowei/category/42133.html</link><description>思考、分享、交流、进步——为了自己的、公司的、中国的、世界的软件技术</description><language>zh-cn</language><lastBuildDate>Mon, 12 Oct 2009 12:32:49 GMT</lastBuildDate><pubDate>Mon, 12 Oct 2009 12:32:49 GMT</pubDate><ttl>60</ttl><item><title>微内核流程引擎（IVR导航）的设计与实现（二）&amp;mdash;&amp;mdash;功能描述</title><link>http://www.blogjava.net/chgaowei/archive/2009/10/12/297956.html</link><dc:creator>常高伟</dc:creator><author>常高伟</author><pubDate>Mon, 12 Oct 2009 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/chgaowei/archive/2009/10/12/297956.html</guid><wfw:comment>http://www.blogjava.net/chgaowei/comments/297956.html</wfw:comment><comments>http://www.blogjava.net/chgaowei/archive/2009/10/12/297956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chgaowei/comments/commentRss/297956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chgaowei/services/trackbacks/297956.html</trackback:ping><description><![CDATA[<p>上一篇介绍了微内核流程引擎开发背景，这篇介绍它的功能描述。  <p><strong>基本功能：</strong>  <p>1、能够通过脚本定义流程，更改流程。  <p>2、对软交换系统应用服务器的所有的接口都可以编辑。  <p>3、异常处理，实现补偿机制。  <p>4、流程要支持：顺序执行，分支处理，跳转执行。  <p>5、脚本中支持简单的数据库操作，比如：记录查询（根据查询结果决定流程），字段查询，记录增删改。  <hr>  <p><strong>扩展功能：</strong>  <p>1、提供多种调用形式：1）动态链接库直接调用；2）socket通信调用；3）远程调用；4）WSDL方式调用。  <p>2、实现一个流程引擎虚拟机。专门处理流程。  <p>3、支持业务以无状态的形式开发。所有的状态在脚本中定义。  <p>4、开发一个流程编辑界面。  <p>5、开发一个脚本编译器，检查脚本的错误。  <p>6、开发一个简单的语言，实现快速流程编辑的功能。这里要实现一个编译器，编译结果就是流程脚本。  <p>7、实现一个方向编译器，从流程脚本到流程开发语言。  <p>上面的这些功能有的已经实现，有的正在实现。后面我会详细描述这些功能的设计与实现。</p><img src ="http://www.blogjava.net/chgaowei/aggbug/297956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chgaowei/" target="_blank">常高伟</a> 2009-10-12 20:08 <a href="http://www.blogjava.net/chgaowei/archive/2009/10/12/297956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微内核流程引擎（IVR导航）的设计与实现（三）&amp;mdash;&amp;mdash;脚本的设计</title><link>http://www.blogjava.net/chgaowei/archive/2009/10/12/297957.html</link><dc:creator>常高伟</dc:creator><author>常高伟</author><pubDate>Mon, 12 Oct 2009 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/chgaowei/archive/2009/10/12/297957.html</guid><wfw:comment>http://www.blogjava.net/chgaowei/comments/297957.html</wfw:comment><comments>http://www.blogjava.net/chgaowei/archive/2009/10/12/297957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chgaowei/comments/commentRss/297957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chgaowei/services/trackbacks/297957.html</trackback:ping><description><![CDATA[<p>我设计的流程引擎是脚步驱动的。脚本中定义了流程执行的环境，流程操作的对象，流程执行的步骤。下面是一个流程脚本的示例： <p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;process name="make_call"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;data type="user_tel"&gt;called_number&lt;/data&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;object type="user" id="global_data:called_number" operation="must"&gt;obj_user&lt;/object&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; //用户对象描述中，号码是必须的，是流程引擎和业务的交互唯一标识，callid是可选的。<br>&nbsp;&nbsp;&nbsp; &lt;object type="user" object_num="global_data:called_number" operation="must"&gt;obj_user&lt;/object&gt;<br>&nbsp;&nbsp;&nbsp; &lt;sequence name="make_call"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;invoke interface="make_call" node="make_call_001" object_user="obj_user" calling_number="6699" original_number="123456" call_type="local_call"&gt; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/invoke&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;invoke interface="play_voice" node="play_voice_001" object_user="obj_user" play_long="100" play_file="/home/welcome.au"&gt; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/invoke&gt;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&lt;/process&gt; <hr>  <p><strong>脚本的含义</strong> ： <p>1、process的name属性表示流程的名称，用于在程序中调用。 <p>2、&lt;data type="user_tel"&gt;called_number&lt;/data&gt;表示定义了一个流程的全局外部变量。有程序在调用流程是作为流程数据传送给流程。这个数据要在后面的流程中使用。 <p>3、&lt;object&gt;部分在流程中定义流程操作的对象。一般分为用户和会场。这里表示是用户。属性“id”表示对象的唯一标识。这里引用的是流程的全局数据：global_data:called_number，也就是在上面定义的数据。属性“operation”表示此对象是可选还是必选。如果是必须，这如果此对象被释放，这流程也要被被结束。否则，不结束。中间的内容表示对象在流程中的唯一标示，这里是obj_user，后面的节点可以通过使用它来操作对象。 <p>4、&lt;sequence&gt;表示顺序调用下面的节点。 <p>5、&lt;invoke &gt;表示调用节点。属性“interface="make_call"”表示此节点调用的接口是make_call。make_call是在代码中定义好的关键字，对应一个软交换系统的接口。属性“node”表示节点的唯一标识，在流程内部唯一，可以在流程跳转的时候使用。 “object_user="obj_user"“表示make_call 接口操作的对象。有&lt;object&gt;创建。 calling_number="6699" original_number="123456" call_type="local_call"表示的是make_call接口调用时的数据。 <p>6、&lt;invoke interface="play_voice"表示对此对象进行放音。 <p>这个脚本的意思是，根据流程输入的号码，创建用户对象，并且发起呼叫，对用户进行放音。 <hr>  <p><strong>复杂的脚步定义：</strong> <p>上面的是一个简单的示例。为了能够实现流程编辑，要考虑很多的情况，要能够进行分支处理，跳转执行，捕获事件等。 <p><strong>1、分支的实现</strong> <p>&nbsp;&nbsp;&nbsp; &lt;recive event="user_key" ="" node="receive_key" object_user="obj_user" time_out="10"&gt;&lt;/recive&gt;<br>&nbsp;&nbsp;&nbsp; &lt;switch condition_type="user_key" object="obj_user"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;case condition="9092"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name="d"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/case&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;case condition="time_out"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name="d"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/case&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;otherwise&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name=""&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goto node="play_voice_001"&gt;goto_001&lt;/goto&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/otherwise&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/switch&gt; <p>1）&lt;recive event="user_key"表示接受指定用户的按键。如果超过10秒为收到按键则认为用户按键结束。 <p>2）&lt;switch condition_type="user_key"表示一用户的按键为分支条件，进行分支处理。 <p>3）&lt;case condition="9092"&gt;表示如果用户的按键式0092的话则进入此分支进行处理。 <p>4）&lt;case condition="time_out"&gt;如果超时为收到用户按键，这进入此分支处理 <p>5）&lt;otherwise&gt;如果上面的条件都不满足，则进入此分支处理。 <hr>  <p><strong>2、跳转的实现：</strong> <p>&lt;goto node="goto_001" next_node="play_voice_001"&gt;&lt;/goto&gt; <p>表示此节点是一个跳转节点，要跳转到的下一个节点是play_voice_001。 <hr>  <p><strong>3、信号捕获的实现：</strong> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pick name="pick_001" time_out="10"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;on_event event="on_ring_180" result="success" reason="normal"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name="008"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/on_event&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;time_out&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name="008"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/time_out&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;otherwise event="on_ring_180:on_ring_183"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sequence name="009"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/otherwise&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/pick&gt; <p>1）&lt;pick name="pick_001" time_out="10"&gt;&lt;pick&gt;活动会等待一组相互排斥事件中的一个事件的发生，然后执行与发生的事件相关联的活动。它会阻塞业务流程执行，以等待某一特定的事件发生，比如接收到一个合适的消息或超时警报响起。当其中任何一个事件被触发后，业务流程就会继续执行，pick也随即完成了，不会再等待其他事件的发生。 <p>2）&lt;on_event event="on_ring_180" result="success" reason="normal"&gt;表示如果收到的on_ring_180，且结果是success，原因是normal。触发此流程的处理。 <p>3）&lt;time_out&gt;表示超时为收到制定事件的处理。 <p>4）&lt;otherwise event="on_ring_180:on_ring_183"&gt;表示收到其他的事件，比如：on_ring_180或on_ring_183，都进入此分支处理。</p><img src ="http://www.blogjava.net/chgaowei/aggbug/297957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chgaowei/" target="_blank">常高伟</a> 2009-10-12 20:08 <a href="http://www.blogjava.net/chgaowei/archive/2009/10/12/297957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>