ESK的个人空间

鞋服行业、系统架构、ERP性能分析、Java技术、工作流、商业智能

  博客园 :: :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     事件驱动在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

posted on 2011-06-04 11:14  ESK  阅读(1604)  评论(0编辑  收藏  举报