开源工作流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

你可能感兴趣的:(源码分析)