??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区在线播放,天天做天天摸天天爽国产一区,国产黄色片在线播放http://www.aygfsteel.com/RongHao/category/38567.html勤学、勤?/description>zh-cnMon, 21 Sep 2009 04:32:04 GMTMon, 21 Sep 2009 04:32:04 GMT60jBPM-Side程设计器架构说?/title><link>http://www.aygfsteel.com/RongHao/archive/2009/09/20/295770.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 20 Sep 2009 13:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2009/09/20/295770.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/295770.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2009/09/20/295770.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/295770.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/295770.html</trackback:ping><description><![CDATA[<br /> <strong>一?nbsp;   代码主要l构</strong><br /> 所谓流E设计器者,无怪乎dxml文gQ图形展玎ͼ操作囑Ş元素Q改变xml文gQ回写,如此而已?br /> <br /> 既然如此Q设计器的流E结构就非常清晰Q首先是xml框架解析xml文g为Model模型lgQ然后Model模型lg被展CؓComponent视图lgQ用户对Component视图lgq行操作Q这些操作被同步的修改到Model模型lgQ最后用户保存时QModel模型lgl过xml框架解析回xml文gQ该文g被上传到服务器或本地覆盖原有的xml文g?br /> <br /> 那么代码l构很清晰了:xml框架、Model模型lg和Component视图lg。但是等{,Model与Component如何交互呢?q里需要GEF框架嫁接起两者的联系。同Ӟ一个流E设计器往往要同时编辑多个流E定义,相比具体的流E定义而言Q设计器拥有一些全局的对象,q些全局对象包括pȝ菜单栏、工h、整个设计器布局框架QProcessDesignerQ、设计器入口QProcessEditorQ,q有是负责保存全局属性和发布/订阅定制事g的TheModel对象?br /> <br /> <strong>二?nbsp;   Component视图lg</strong><br /> 很直接,Component视图lg指的是与用户打交道的、与程定义相关的视囑օ素。注意这里的一个定语:与流E定义相关的Q即不包括系l菜单、工hq些东东。这些视囑օ素很单,包括dѝ各U节点元素和q接U元素?br /> <br /> 代码位于org.jbpmside.view.component和org.jbpmside.view.component.node下。主要类SurfaceComponent、NodeComponent和ConnectionComponent。看cd很清晰q些cd别代表着什么组Ӟ<br /> •    SurfaceComponent代表d板;<br /> •    NodeComponent代表节点Q?br /> •    ConnectionComponent代表q接U;<br /> <br /> org.jbpmside.view.component.node下的cd是NodeComponentcȝ子类Q代表具体的单个节点cd了,包括开始节炏V结束节炏VFork节点、Join节点{等?br /> <br /> Component视图lg使用了degrafa来渲染表现Ş式?br /> <br /> 目前~少一个属性弹出框lgQ职责展现和修改节点/q接U属性?br /> <br /> <strong>三?nbsp;   Model模型lg</strong><br /> Xml程定义文g解析为本地Model模型lgQ本地徏模和jBPM4的PVM建模一_代码位于org.jbpmside.model下,重要的类Q?br /> •    ProcessModel代表程定义Q?br /> •    NodeModel代表节点定义Q?br /> •    ConnectionModel代表q接U定义;<br /> 剩下的就是具体节点类型的模型c,例如StartNode/EndNode/TaskNode{?br /> <br /> 目前模型c还非常单,因ؓ前段旉主要xComponent视图lg部分Q接下来很快会与jPDL规范完全同步Q同时ProcessModel/NodeModel/ConnectionModel会进行重构,目标是与jBPM4模型完全一致?br /> <br />  最新的模型位于org.jbpmside.model.common下,对jpdl4的支持位于org.jbpmside.model.jpdl4下,未来需要将Component与Model的关联迁U至common包下?br /> <br /> <strong>四?nbsp;   GEF框架</strong><br /> GEF框架嫁接Model与Component?br /> <br /> <strong>1?nbsp;   IGraphicalEditor与IEditPart</strong><br /> IGraphicalEditor与IEditPart是GEF框架里最重要的两个接口:<br /> •    IGraphicalEditor代表整个囑Ş~辑器,IGraphicalEditor里最重要的方法:<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">function get graphicViewer():GraphicViewer;</span></div> <br /> <br /> q回当前的图形视图。在当前的设计里Q设计器支持多个TabPaneQ每个流E定义会拥有一个单独的囑Ş视图Q即一个TabPaneQ,q里的图形视囑֍指当前处于激z(~辑Q状态的d板;很显然IGraphicalEditor是一个全局cR?br /> <br /> •    IEditPart代表单个的图形编辑元素,很显Ӟq些元素是和Componentlg一致的QIEditPart里最为重要的ҎQ?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">function get model():Object;<br /> <br /> function set model(_model:Object):</span><span style="color: #0000ff;">void</span><span style="color: #000000;">;</span></div> <br /> Componentlgl承于IEditPartQ这样就瞬间Componentlg与Model兌h。IEditPart重要的实现类包括GraphicViewer与GraphicEditPart?br /> GraphicViewer被SurfaceComponentl承Q?br /> GraphicEditPart被NodeComponent和ConnectionComponentl承?br />  <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/ronghao/model.png" height="502" width="838" /><br /> <strong>2?nbsp;   Tool</strong><br /> Flex应用E序是基于事仉动的Q用户对界面的操作即反映到各U鼠标和键盘事g上。在原先的设计里Q由Componentlg自己来处理各U原生事Ӟ当需要其他组件协作时Q通过TheModel发出应用定制事g。在GEF的设计里QComponentlg的原生事件处理被委派到Toolc进行处理。Componentlg只管理自w的囑Ş渲染和变化?br /> 例如SurfaceComponent处理鼠标点击事g代码Q?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">public</span><span style="color: #000000;"> function mouseClickHandler(event:MouseEvent):</span><span style="color: #0000ff;">void</span><span style="color: #000000;"><br />         {<br />             … …<br />             </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.tool.mouseClick(event, compX, compY);<br />         }</span></div> <br />       <br /> 注意this.toolҎQ这个方法同h由GraphicViewer和GraphicEditPart分别  引入的。注意有些时候组件的Tool是需要切换的Q例如鼠标点击面板,通常会导致被选中的节Ҏq接UK中状态消失,但是当工h选中一个节ҎQ这个鼠标事件会D向面板增加相应的节点。这旉要ToolManager来进行Tool却换的管理,针对SurfaceComponent/NodeComponent/ConnectionComponent分别有SurfaceToolsManager/NodeToolsManager/ConnectionToolsManager来管理不同的Tool切换{略。需要注意的是ToolManager和Tool都是无状态的Q全局唯一Q所有视囄件共用?br /> <br /> <strong>3?nbsp;   Command</strong><br /> 视图lg的变化会DModellg的变化。Tool处理视图原生事g、调用CommandService执行各个Command具体操作视图lg和Model对象实现视图lg和Modellg的变化?br /> <br /> CommandService与SurfaceComponentq行一对一l定。CommandService持有CommandStackQ实现单个Tab~辑界面内Command的redo和undo?br /> <br /> 具体操作视图lg和Model对象必须通过Command?br /> <br /> <strong>五?nbsp;   TheModel全局cȝ用?/strong><br />       TheModel全局唯一Q职责如下:<br /> •    负责应用所有定制事件的订阅/分发Q?br /> •    负责持有工具条和pȝ菜单属性;<br /> •    负责持有剪脓板,实现各个L之间的节Ҏ?剪切?br /> <br /> <strong>六?nbsp;   ProcessDesigner与ProcessEditor</strong><br /> ProcessDesigner负责整个应用的布局Q目前由三部分组成,pȝ菜单、工h和TabNavigatorQTabBar理器)QTabBar理器负责添加和删除TabQ由Tab加蝲LQ这样实现对多流E定义同时编辑的支持Q即多TabQ?br /> <br /> ProcessEditor是应用的入口Q它持有ProcessDesignerQ实CIGraphicalEditor接口。目前其对graphicViewerQ)Ҏ的实现是q回当前Ȁzȝ态Tab的画ѝ?br /> <br /> 同时QProcessEditor负责l一监听工具?键盘事gQƈ这些事件处理委z当前处于Ȁzȝ态的TabL处理?br /> <br /> <strong>七?nbsp;   Xml框架</strong><br /> 位于org.jbpmside.xml下,使用E4XQ用binding对各U类型的节点q行解析Q不集中在一个文件完成解析和转换Q一个节点类型对应一个binding。用代码如下:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">   </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> function parse(xml:String):ProcessDefinition{<br />     var parser:Parser</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Parser();<br />     </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> parser.createParse().setString(xml).<br />           execute().getProcessDefinition() as ProcessDefinition;<br /> }</span></div> <br /> <br /> 试代码位于test目录下,是目前唯一可以q行单元试的部分?br /> <br /> <strong>八?nbsp;   q需要完成的工作</strong><br /> 1?nbsp;   xml框架q需要大量的解析工作完成Q以支持jpdl4Q?br /> 2?nbsp;   W一个版本ؓ本地应用Q需要增加对本地文g操作的支?br /> 3?nbsp;   模型q移至org.jbpmside.model.common<br /> 4?nbsp;   工具条用flexlib重写Q新?6位图?节点属性弹出框<br /> 5?nbsp;   Command目前只实C对undo的支持,需要实现对redo的支?br /> <br /> <br /> <img src ="http://www.aygfsteel.com/RongHao/aggbug/295770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2009-09-20 21:17 <a href="http://www.aygfsteel.com/RongHao/archive/2009/09/20/295770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM4与Spring的集?/title><link>http://www.aygfsteel.com/RongHao/archive/2009/06/22/283605.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 22 Jun 2009 08:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2009/06/22/283605.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/283605.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2009/06/22/283605.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/283605.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/283605.html</trackback:ping><description><![CDATA[       现在行抱大腿,不过对眼光的要求也高。要不就如高也,即四眼Q一h用。对Java企业开发而言QSpring的腿则是一定要q。而所谓抱Spring的腿Q无外乎三点Q?br /> <br /> 一是通过Spring暴露出服务,服务配|到Spring的IOC容器里;<br /> 二是在自qq行环境里访问到Spring的IOC容器Q能够轻松用Spring容器里所配置的服务;<br /> 三是对于h事务理Ҏ的目来说Q将事务理与Spring的事务管理进行合q?br /> <br />         下面分别讨论Q?br /> <br /> <strong>一?nbsp;   通过Spring暴露服务</strong><br /> q记得在jBPM4的运行期环境里提到的JbpmConfiguration吗?它是整个jBPM4的入口,q且是整个应用独此一份的。通过它可以获取processEngineQƈ藉此获得工作引擎所提供的各U服务:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><br /> ProcessEngine processEngine </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Configuration()<br />       .buildProcessEngine();</span></div> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><br /> RepositoryService repositoryService </span><span style="color: #000000;">=</span><span style="color: #000000;"> processEngine.getRepositoryService();<br /> ExecutionService executionService </span><span style="color: #000000;">=</span><span style="color: #000000;"> processEngine.getExecutionService();<br /> TaskService taskService </span><span style="color: #000000;">=</span><span style="color: #000000;"> processEngine.getTaskService();<br /> HistoryService historyService </span><span style="color: #000000;">=</span><span style="color: #000000;"> processEngine.getHistoryService();<br /> ManagementService managementService </span><span style="color: #000000;">=</span><span style="color: #000000;"> processEngine.getManagementService();</span></div> <br /> 通过Spring暴露q些服务Q配|如下:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><</span><span style="color: #000000;">bean id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jbpmConfiguration</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.jbpm.pvm.internal.cfg.SpringConfiguration</span><span style="color: #000000;">"</span><span style="color: #000000;">></span><span style="color: #000000;"><br />         </span><span style="color: #000000;"><</span><span style="color: #000000;">constructor</span><span style="color: #000000;">-</span><span style="color: #000000;">arg value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">be/inze/spring/demo/jbpm.cfg.xml</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">/></span><span style="color: #000000;"><br />     </span><span style="color: #000000;"></</span><span style="color: #000000;">bean</span><span style="color: #000000;">></span><span style="color: #000000;"><br />    <br />     </span><span style="color: #000000;"><</span><span style="color: #000000;">bean id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">processEngine</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jbpmConfiguration</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">method</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">buildProcessEngine</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">/></span><span style="color: #000000;"><br />     </span><span style="color: #000000;"><</span><span style="color: #000000;">bean id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">repositoryService</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">processEngine</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">method</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">getRepositoryService</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">/></span><span style="color: #000000;"><br />     </span><span style="color: #000000;"><</span><span style="color: #000000;">bean id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">executionService</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">processEngine</span><span style="color: #000000;">"</span><span style="color: #000000;"> factory</span><span style="color: #000000;">-</span><span style="color: #000000;">method</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">getExecutionService</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">/></span></div> <br /> <br /> l心的你会发玎ͼ配置时用了JbpmConfiguration 的子cSpringConfiguration。SpringConfiguration相比JbpmConfiguration有哪些增强呢Q下面再讌ӀMQ现在,可以用Spring来获取或注入q些Jbpm4所提供的服务了?br /> <br /> <strong>二、在environment里加入SpringContext</strong><br /> jBPM4的environmentQ运行期环境Q提供Engine IOCQprocess-engine-contextQ和Transaction IOCQtransaction-contextQ。要惛_q行期方便地讉K到Spring里所配置的服务,最直接的方法就是在environment里加入Spring IOCQapplicationContextQ的引用?br /> SpringConfigurationx对JbpmConfiguration增强了对Spring IOC的一个引用?br />  <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/ronghao/SpringConfiguration.png" width="640" height="413" /><br /> SpringConfiguration是如何做到的呢?单,实现Spring的ApplicationContextAware接口Q自动持有applicationContextQ然后openEnvironment时将其加入environment?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">environment.setContext(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SpringContext(applicationContext));</span></div> <br /> <br /> SpringContext是对applicationContext的简单封装?br /> <br /> 那么什么从Engine IOCUL到Spring IOC了呢Q是的,最重要的就是Hibernate Session Factory?br /> <br /> 在jbpm.cfg.xml的process-engine-context里干掉:<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">    </span><span style="color: #0000ff;"><</span><span style="color: #800000;">hibernate-configuration</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">cfg </span><span style="color: #ff0000;">resource</span><span style="color: #0000ff;">="jbpm.hibernate.cfg.xml"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;">    <br />     </span><span style="color: #0000ff;"></</span><span style="color: #800000;">hibernate-configuration</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">hibernate-session-factory </span><span style="color: #0000ff;">/></span></div> <br />   <br /> 相关配置挪动至Spring配置文g?br /> <br /> <strong>三?nbsp;   事务</strong><br /> 哪里有数据库操作Q哪里就有事务。对于嵌入式工作而言Q最重要的集成就是事务的集成。这里先分析jBPM4的事务实玎ͼ然后再介l集成入Spring的事务实现?br /> <br /> <strong>1?nbsp;   Command模式</strong><br /> jBPM4的逻辑实现采用了Command模式?br />  <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/ronghao/Command.png" width="1071" height="536" /><br /> 采用Command模式后,jBPM4对CommandService构造拦截器QInterceptorQ链Q配|在jbpm.cfg.xml的process-engine-context里:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">command-service</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">retry-interceptor </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">environment-interceptor </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">standard-transaction-interceptor </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"></</span><span style="color: #800000;">command-service</span><span style="color: #0000ff;">></span></div> <br /> <br /> 2?nbsp;   原有的事务实?br /> jBPM4原有的事务通过StandardTransactionInterceptor实现Q在CommandService执行Command之前打开事务Q实际委zHibernate的事务管理)Q完成后提交/回滚?br />  <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/ronghao/Command-Interceptor.png" width="758" height="490" /><br /> jBPM4的事务是ZCommand的?br /> <br /> 3?nbsp;   集成入Spring的事务实?br /> Spring的事务是Z服务调用的?br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/ronghao/Spring-interceptor.png" width="1012" height="536" /><br /> 使jBPM4使用Spring提供的事务:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">command-service</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">retry-interceptor </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">environment-interceptor </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;"><</span><span style="color: #800000;">spring-transaction-interceptor </span><span style="color: #ff0000;">current</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">command-service</span><span style="color: #0000ff;">></span></div> <br /> <br /> 拦截器换?strong>SpringTransactionInterceptor</strong>QSpringTransactionInterceptor从environment 提供的Spring IOC获取PlatformTransactionManagerQ用事务模板回调CommandQ事务传播模式强制加入当前事务?br /> <br /> 同时Q对hibernate session的配|(jbpm.cfg.xml的transaction-contextQ强制从当前U程中获取:<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">hibernate-session </span><span style="color: #ff0000;">current</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/></span></div> <br /> q干掉原有的事务实现Q?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">transaction </span><span style="color: #0000ff;">/></span></div> <br /> 参考文档:<br /> http://www.slideshare.net/guest8d4bce/spring-integration-with-jbpm4<br /> <br /> <br /> <img src ="http://www.aygfsteel.com/RongHao/aggbug/283605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2009-06-22 16:38 <a href="http://www.aygfsteel.com/RongHao/archive/2009/06/22/283605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM4的运行期环境http://www.aygfsteel.com/RongHao/archive/2009/06/17/282897.htmlronghaoronghaoWed, 17 Jun 2009 10:15:00 GMThttp://www.aygfsteel.com/RongHao/archive/2009/06/17/282897.htmlhttp://www.aygfsteel.com/RongHao/comments/282897.htmlhttp://www.aygfsteel.com/RongHao/archive/2009/06/17/282897.html#Feedback5http://www.aygfsteel.com/RongHao/comments/commentRss/282897.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/282897.html         理想中的环境是什么样子的哩。好吧,一句话Q召之即来,挥之卛_Q当需要某个服务时QokQ打个响指,该服务就准备好被调用了,调用完毕后也不用费心费力地擦屁股Q不必老是提心吊胆有好事者追问:你擦了吗Q确定擦了?真的定擦了Q直接丢弃给环境降解处理Q自然又环保Q还有个好名声叫专注领域逻辑?br />
一?nbsp;   q行期环境就是一个餐?/strong>
1?nbsp;   提供必要的服?br /> 作ؓ一个餐馆,必须有厨师做饭我吃,必须有桌子和椅子。作行期环境同样如此Q我要发消息Q你得提供我发消息的ServiceQ我要获取节点Q务,你得扔给我TaskService?br />
2?nbsp;   提供获取q些服务的统一方式
好吧Q我不会亲自到厨房告诉厨师我惛_什么(因ؓ我担心这样一来我会吃不下去)Q我也不会亲自到攉台给钱。这些服务有一个统一的获取方式:服务员。我惛_什么和l̎Q告诉服务员卛_。关键是q一方式要统一Q要_单。Spring最懒,把服务给你全部注入了Q当然你也可以握住BeanFactory的纤U细手,一个一个的get?br />
3?nbsp;   提供特定于我U程不安全的服务
我点了一盘鱼香肉丝,隔壁也点了一盘鱼香肉丝,l果服务员让我们吃同一盘鱼香肉丝。我立刻跌v来:靠,你们的服务不是线E安全的吗?QHibernate的Session正是属于q么一U情况,需要环境进行隔,我的唯一职责是吃饭Q我的领域逻辑是如何优的q餐Qؓ此还要不断重构我吃饭的姿势哩?br /> 好不Ҏ吃完饭,付完ƾ,正准备离场。服务员风度翩地走到我的n旁,我以有打折券供应Q结果是Q服务员姐d朱唇Q先生,ȝ您把吃剩的盘子清z完毕?br /> 崩溃Q?br /> 像数据库q接的打开Q关闭、事务的打开、提交等都属于运行期环境应该做的事情?br />
4?nbsp;   其他的七七八?br /> 杂事不少Q例如统一的事件机制、权限拦截等{?br />
二?nbsp;   jBPM4的运行期环境
好吧Q先来看看如何徏立jBPM4的运行期环境Q?br />
EnvironmentFactory environmentFactory = new DefaultEnvironmentFactory();
 
  
 
  Environment environment 
= environmentFactory.openEnvironment();
  
try {
 
     everything available in 
this block 
 
  } 
finally {
    environment.close();
  }


两个关键的类QEnvironmentFactory和Environment?br />
EnvironmentFactory是全局的,在整个应用程序中保持一个实例即可?br />
Environment则是每次Ҏ调用则要new一个?br />
看看Environment的主要方法:
public abstract Object get(String name);
public abstract <T> T get(Class<T> type);


是的Qenvironment为我们的代码提供所需要的服务cd例?br />
那么Q如何获得environmentQ?br /> l箋看:
public static Environment getCurrent()Q?/span>

staticQ我喜欢也。方ѝ快P不管是在C、R上还是房上Q随处都可调用?br />
那么Qؓ什么Environment每次调用要new呢?
好吧Q当你需要获取数据库Session的时候,是不是每ơ都要new呢。Environment提供的服务里包括了非U程安全的数据库操作服务?br />
三?nbsp;   jBPM4q行期环境的实现

1、JbpmConfiguration
JbpmConfiguration是jBPM4里最重要的类Q它是整个应用程序的入口。它实现了EnvironmentFactory接口?br />
      JbpmConfiguration加蝲jBPMȝ配置文gQ还是大概扫一下这个配|文Ӟ
      <jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">

  
<process-engine-context>
 
    
<repository-service />
    
<repository-cache />
    
<execution-service />
    
<history-service />
    
<management-service />
    
<identity-service />
    
<task-service />

    
<hibernate-configuration>
      
<cfg resource="jbpm.hibernate.cfg.xml" />    
    
</hibernate-configuration>

    
<hibernate-session-factory />
 
  
</process-engine-context>

  
<transaction-context>
    
<repository-session />
    
<pvm-db-session />
    
<job-db-session />
    
<task-db-session />
    
<message-session />
    
<timer-session />
    
<history-session />
  
</transaction-context>

</jbpm-configuration>


配置文g被分Z两部分,分别是:process-engine-context和transaction-context?br /> 对应于两个IOC容器QWireContextQ的配置文g?br />
作ؓEnvironmentFactoryQJbpmConfiguration持有成品process-engine-context对应的IOC容器Q全局的)实例Q持有半成品transaction-context的WireDefinition。当调用openEnvironmentҎӞJbpmConfiguration会new EnvironmentQ然后将process-engine-context IOC填充入environmentQ同时初始化transaction-context IOCQƈ其也填充入environment。这样通过environment可以获得所有所需要的服务Q包括全局的和非线E安全的服务实例。也是environment透过IOC容器提供了查扑֐U服务的能力?br />

 

2、与U程l定的environment
environment初始化之?避免参数传递得一塌糊涂的方式是environment与线E绑定。看Environment的代码:
  static ThreadLocal<Environment> currentEnvironment = new ThreadLocal<Environment>();

  
static ThreadLocal<Stack<Environment>> currentEnvironmentStack = new ThreadLocal<Stack<Environment>>();


是的Q在openEnvironmentӞ有这么一行代码:
Environment.pushEnvironment(environment);


q样environment׃U程l定了,可以通过Environment.getCurrent()L调用了?br />
哪里有压q,哪里有放抗?br /> 在environment.close()Ҏ里:

Environment.popEnvironment();


OKQ结束?br />



ronghao 2009-06-17 18:15 发表评论
]]>
Jbpm4的IOC容器http://www.aygfsteel.com/RongHao/archive/2009/05/07/269465.htmlronghaoronghaoThu, 07 May 2009 10:43:00 GMThttp://www.aygfsteel.com/RongHao/archive/2009/05/07/269465.htmlhttp://www.aygfsteel.com/RongHao/comments/269465.htmlhttp://www.aygfsteel.com/RongHao/archive/2009/05/07/269465.html#Feedback1http://www.aygfsteel.com/RongHao/comments/commentRss/269465.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/269465.html
一?nbsp;   Jbpm4 IOC容器介绍
IOC容器的目的是理lg和实现组件之间的解耦。和Spring里的BeanFactory对应QJbpm4里的接口是ContextQ具体实现则是WireContext。Context实际在Jbpm4里有更多的含义,它与Environment一P共同构成了代码运行的q行期环境。在q个环境里可以获取系l的lgQ更为重要的是提供了数据库连接(sessionQ和事务Q这个稍后会Ԍ?br />
先来看看Context接口的核心方法:
      Object get(String key);
  
<T> T get(Class<T> type);


很明显,提供两种从容器里获取lg的方法,一U是通过nameQ一U是通过type?br />
对于IOC容器来说Q一般情况下都会提供一U加载的方式Q比如从xml文gq行加蝲、从资源文gq行加蝲。Jbpm4透过WireParser具备从xml加蝲的能力?br />
此外QWireContext通过一个Map~存初始化后的组件?br />
二?nbsp;   Jbpm4 IOC容器实现
容器的实现有五个关键cd接口Q分别是QWireParser、Binding、Descriptor、WireDefinition和WireContext?br />  

WireParserdxml文gQ同时WireParser会加载一pd的Binding(默认从jbpm.wire.bindins.xml文gd加蝲)?br />
Binding负责Ҏxml里元素的tagxml元素转换为对应的Descriptor?br />
Descriptor负责初始化对象。它们被d到WireDefinition?br />
WireDefinition被WireParserq回lWireContext。WireContext创徏对象时会讉KWireDefinition里的DescriptorQ同时将初始化对象的d委托lDescriptor自n?br />
需要注意的是:Jbpm4在初始化对象时有着四种{略Q分别是Qgq创建和初始化、gq创建和立刻初始化、立d建和延迟初始化、立d建和立刻初始化?br />
立刻创徏Q在WireContext创徏完毕后对象就已经创徏?br /> 延迟创徏Q调用WireContext的getҎ获取该对象时才创对象?br /> 初始化:一般完成对象属性的注入{操作?br />
三?nbsp;   Jbpm4 IOC容器在Jbpm4里的应用
IOC容器在Jbpm4里最重要的作用就是加载Jbpm的ȝ配置文gQ默认是jbpm.cfg.xmlQ,q也是整个Jbpm应用的v炏V大概扫一下这个配|文Ӟ

<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">

  
<process-engine-context>
 
    
<repository-service />
    
<repository-cache />
    
<execution-service />
    
<history-service />
    
<management-service />
    
<identity-service />
    
<task-service />

    
<hibernate-configuration>
      
<cfg resource="jbpm.hibernate.cfg.xml" />    
    
</hibernate-configuration>

    
<hibernate-session-factory />
 
  
</process-engine-context>

  
<transaction-context>
    
<repository-session />
    
<pvm-db-session />
    
<job-db-session />
    
<task-db-session />
    
<message-session />
    
<timer-session />
    
<history-session />
  
</transaction-context>

</jbpm-configuration>


可以看到配置文g被分Z两部分,分别是:process-engine-context和transaction-context。在实际应用中,它们分别对应着两个不同的WireContext:ProcessEngineContext和TransactionConext。ProcessEngineContext覆盖了jbpm4里最重要的服务类Q这些类是全局唯一的,当然QProcessEngineContext也是独此一份。本是同根生Q命q各不同。TransactionConext则是在每ơopenEnvironment旉新创建,因ؓ其包含了数据库连接和事务?br />
贯穿于整个Jbpm4中,q两个Context被压到Environment里(Environment和线E绑定)Q在M需要的地方都能提供一条龙的服务。于是,在很多领域类里,利用q些服务实现充血模型是很顺理成章的一件事了?br />
ȝ: ProcessEngineContextl引擎领域模型提供全局的组件查找;TransactionConext提供数据库相x务?br />



ronghao 2009-05-07 18:43 发表评论
]]>
JbpmSide介绍http://www.aygfsteel.com/RongHao/archive/2009/03/30/262833.htmlronghaoronghaoMon, 30 Mar 2009 02:35:00 GMThttp://www.aygfsteel.com/RongHao/archive/2009/03/30/262833.htmlhttp://www.aygfsteel.com/RongHao/comments/262833.htmlhttp://www.aygfsteel.com/RongHao/archive/2009/03/30/262833.html#Feedback0http://www.aygfsteel.com/RongHao/comments/commentRss/262833.htmlhttp://www.aygfsteel.com/RongHao/services/trackbacks/262833.html
JbpmSide仍然定位于一个完整的工作解x案?nbsp; 阅读全文

ronghao 2009-03-30 10:35 发表评论
]]>
JbpmSide程设计器进?/title><link>http://www.aygfsteel.com/RongHao/archive/2009/03/26/262249.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 26 Mar 2009 14:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/RongHao/archive/2009/03/26/262249.html</guid><wfw:comment>http://www.aygfsteel.com/RongHao/comments/262249.html</wfw:comment><comments>http://www.aygfsteel.com/RongHao/archive/2009/03/26/262249.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/RongHao/comments/commentRss/262249.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/RongHao/services/trackbacks/262249.html</trackback:ping><description><![CDATA[汇报一下设计器当前q度以及下一阶段主要的开发目标?br /> 当前q度主要集中在图像处理方面:<br />     1、采用RiawaveQ完成了整个设计器图形处理的架构<br />     2、工作流节点的图形徏?br />     3、节点的拖拽以及q线<br />     4、节炏V连U的剪脓、复制、删除操作,支持快捷?br />     5、画板的~放和Grid昄与否<br /> 采用的图形类库是Degrafa?br /> 下一阶段Q?-3周)会实C下的功能Q?br />     1、目前的q线是通过点击两个节点出现的,支持单独的q线增加Q两UŞ式:直线、曲U)<br />     2、增加不同节点对q线的约束,卛_始节点只能出、Q务节点单q单出等?br />     3、采用flexlib实现新的设计器菜单(Tabpane形式Q,同时图形模型工hUd左侧垂直攄<br />     4、do/undo功能Q将所有对L的操作重构ؓCommand模式<br /> 余下的功能包括:导出囄、打印等?br /> q阶D늚主要d是实现设计器的图形功能,不考虑XML的{换和建模。其中包括根据大家的反馈改变部分的现实细节。源代码尽快放出。请xJbpmSide?br /> <img alt="" src="http://jbpmside.group.javaeye.com/topics/download/ef606103-85ee-36aa-9e5d-30b4d4ee1753" width="1173" height="650" /><br /> <img src ="http://www.aygfsteel.com/RongHao/aggbug/262249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/RongHao/" target="_blank">ronghao</a> 2009-03-26 22:21 <a href="http://www.aygfsteel.com/RongHao/archive/2009/03/26/262249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">п</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ļ</a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank">ն</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ԣ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">°</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ײ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">綫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">«ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǡ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>