zoukankan      html  css  js  c++  java
  • 开源工作流Fireflow源码分析之事件驱动

         事件驱动在fireflow用的频率很高.比如:StartNodeInstance,TransitionInstance,ActivityInstance,LoopInstance,EndNodeInstance

         1):定义事件监听器接口模型

    package org.fireflow.kernel.event;
    import org.fireflow.kernel.KernelException;
    /**
     *定义事件监听器模型
     *
     */
    public interface INodeInstanceEventListener {
    	/**
    	 * 节点实例监听器
    	 * @param e
    	 * @throws KernelException
    	 */
           public void onNodeInstanceEventFired(NodeInstanceEvent e)throws KernelException;
    }
    

     2):定义事件模型,它继承于EventObject

     

    package org.fireflow.kernel.event;
    import java.util.EventObject;
    import org.fireflow.kernel.IToken;
    /**
     * 事件模型
     * 
     * @author chennieyun
     * 
     */
    @SuppressWarnings("serial")
    public class NodeInstanceEvent extends EventObject {
    	// 事件类型
    	public static final int NODEINSTANCE_TOKEN_ENTERED = 1;
    	public static final int NODEINSTANCE_FIRED = 2;
    	public static final int NODEINSTANCE_COMPLETED = 3;
    	public static final int NODEINSTANCE_LEAVING = 4;
    	// 默认的事件类列
    	int eventType = -1;
    	private IToken token = null;
    
    	private NodeInstanceEvent() {
    		super(null);
    	}
    	// 注册事件源
    	public NodeInstanceEvent(Object source) {
    		super(source);
    	}
    
    	public IToken getToken() {
    		return token;
    	}
    
    	public void setToken(IToken tk) {
    		this.token = tk;
    	}
    
    	public int getEventType() {
    		return eventType;
    	}
    
    	public void setEventType(int eventType) {
    		this.eventType = eventType;
    	}
    }
    

         3:触发事件, 以ActivityInstance为例

              //触发Activity Entered事件
            //定义一个数据源
            NodeInstanceEvent event1 = new NodeInstanceEvent(this);
            //设置当前的令牌
            event1.setToken(tk);
            //设置当前的事件类型
            event1.setEventType(NodeInstanceEvent.NODEINSTANCE_TOKEN_ENTERED);
            //触发事件
            fireNodeEvent(event1);
      	/**
    	 * wangmj  20090914 增加统一的触发方法,实现类中根据事件的不同而进行触发
    	 * @param event
    	 * @throws KernelException
    	 */
    	public void fireNodeEvent(NodeInstanceEvent event) throws KernelException{
    		for (int i=0;i<this.eventListeners.size();i++){
    			INodeInstanceEventListener listener = this.eventListeners.get(i);
    			listener.onNodeInstanceEventFired(event);
    		}
    	}
    

       4:其它说明, StartNodeInstance,TransitionInstance,ActivityInstance,LoopInstance,EndNodeInstance都有一些默认的事件监听器,具体在FireflowContext.xml中定义.

        

       <!-- **************Kernel Manager Begin*************** -->
        <bean id="kernelManager"
              class="org.fireflow.kernel.KernelManager">
            <property name="kernelExtensions">
                <map>
                    <entry key="org.fireflow.kernel.StartNodeInstance">
                        <list>
                            <ref local="startNodeInstanceEventListenser"/>
                        </list>
                    </entry>
                    <entry key="org.fireflow.kernel.ActivityInstance">
                        <list>
                            <ref local="activityInstanceEventListener"/>
                        </list>
                    </entry>
                    <entry key="org.fireflow.kernel.SynchronizerInstance">
                        <list>
                            <ref local="synchronizerInstanceEventListenser"/>
                        </list>
                    </entry>
                    <entry key="org.fireflow.kernel.EndNodeInstance">
                        <list>
                            <ref local="endNodeInstanceEventListenser"/>
                        </list>
                    </entry>
                    <entry key="org.fireflow.kernel.TransitionInstance">
                        <list>
                            <ref local="transitionInstanceEventListenser"/>
                        </list>
                    </entry>
                    <entry key="org.fireflow.kernel.LoopInstance">
                        <list>
                            <ref local="loopInstanceEventListenser"/>
                        </list>
                    </entry>
                </map>
            </property>
        </bean>
    

    Fireflow的官方网站为:

    http://www.fireflow.org/forum.php

  • 相关阅读:
    BZOJ1093: [ZJOI2007]最大半连通子图
    BZOJ4033: [HAOI2015]树上染色
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    BZOJ4944: [Noi2017]泳池
    BZOJ1269: [AHOI2006]文本编辑器editor
    BZOJ4596: [Shoi2016]黑暗前的幻想乡
    BZOJ1815: [Shoi2006]color 有色图
    BZOJ1488: [HNOI2009]图的同构
    BZOJ3527: [Zjoi2014]力
    Salazar Slytherin's Locket CodeForces
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2072530.html
Copyright © 2011-2022 走看看