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

  • 相关阅读:
    springboot 启动报错"No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available"
    使用SpringCloud Stream结合rabbitMQ实现消息消费失败重发机制
    Java 继承
    Java 抽象类 抽象方法 使用说明
    java 构造器(构造方法)使用详细说明
    Java enum枚举在实际项目中的常用方法
    万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段
    Nginx 如何自定义变量?
    听说你的资源被盗用了,那你知道 Nginx 怎么防盗链吗?
    Nginx 的变量究竟是怎么一回事?
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2072530.html
Copyright © 2011-2022 走看看