Shark包、流程管理

来源:互联网 发布:小白的第一本书python 编辑:程序博客网 时间:2024/06/03 00:01

org.enhydra.shark.SharkEngineManager

 

SharkEngineManagershark引擎的控制室,它在shark引擎内部使用,shark引擎的所有管理器都是由它产生的。

SharkEngineManager使用了singleton模式,保证整个系统只有一个它的instance

// the one and only instance of this class

   private static SharkEngineManager engineManager;

 

   static SharkEngineManager getInstance () {

      if (engineManager==null) {

         engineManager=new SharkEngineManager();

      }

      return engineManager;

   }

 

SharkEngineManager的所有get()方法的作用都是返回初始化时实例化的管理器,这些管理器也是singleton的,这样通过一个类,实现了无限个类的singleton模式,这在我们平常的系统中可以借鉴。

 

当系统启动时,将调用Shark.conf()进行系统的配置,配置时将调用SharkEngineManager的init (Properties properties)方法,该方法示例如下:

void init (Properties properties) {       

          String objectFactoryClassName=properties.getProperty

         ("ObjectFactoryClassName",

          "org.enhydra.shark.SharkObjectFactory");     

 

      String amClassName =properties.getProperty

         ("AssignmentManagerClassName");

   …………

}

如上所示,首先从properties中读ObjectFactoryClassName,如果有,则使用配置文件中的;如果没有,则用org.enhydra.shark.SharkObjectFactory。AssignmentManagerClassName也是从配置文件中读的。

 

Init()的下一步是用读到的配置或用缺省的配置将各管理器实例化,在后面运行时直接取用,如下:

try {

         callbackUtilities=(CallbackUtil)cl.loadClass(cbuClassName).newInstance();

callbackUtilities.setProperties(properties);

         objectFactory =(SharkObjectFactory)cl.loadClass(objectFactoryClassName).newInstance();

         toolAgentManager = (ToolAgentManager) cl.loadClass(tamClassName).newInstance();

         xmlInterface=new XMLInterfaceForJDK13();

      } catch (Throwable ex) {

         throw new Error("Problems instantiating core managers");

      }

当然了,这里返回的都是接口,所以,我们可以方便的扩展它,只要写自己的类继承这些接口,然后在配置文件中进行配置,就可以不动它的代码而达到扩展的目的。

/**
*
输入的是流程定义文件名,返回的是流程定义的包ID

*/

public String packageLoad(String xpdlName) throws MyException

    {  

  //(1)返回库管理器

       RepositoryMgr rm = Shark.getInstance().getRepositoryManager();

 //(2)库管理器得到包ID

       String pkgId = rm.getPackageId(xpdlName);

//(3)得到包管理器

        PackageAdministration pa = Shark.getInstance().getAdminInterface().getPackageAdministration();

       if (!pa.isPackageOpened(pkgId))

       {

           try

           {

//(4)装载流程定义

              pa.openPackage(xpdlName);

           }

           catch (Exception e)

           {

              throw new MyException (e);

           }

       }

       return rm.getPackageId(xpdlName);

    }

 

 

(1)返回库管理器

该功能实际是通过SharkEngineManger来实现的,如下:

public RepositoryMgr getRepositoryManager () {

      return SharkEngineManager.getInstance().getObjectFactory().createRepositoryManager();

   } 

SharkRepositoryMgr的实现类是RepositoryManager

(2) 库管理器得到包ID

  该功能实现时,实现取出SharkUtilities.EXTERNAL_PACKAGES_REPOSITORY下的全部流程定义,再进行文件名的比较.

(3)得到包ID,余下的事情交由PackageAdministration来完成

Shark流程启动过程

 

1)      定位工作流服务器

      Shark.configure("Shark.conf");

      SharkInterface si= Shark.getInstance();

2) 连接工作流服务器

   SharkConnection sc= si. getSharkConnection();

   sc. connect(username, pwd, engineName, scope);

3) 产生流程

       WfProcess wfp = sc.createProcess(pkgId, pDefId);

       在产生流程时,使用的是SharkConnection的对象,该对象中保存了用户信息,用户信息作为产生的流程的requester;

      然后用两个参数:包定义ID和流程定义ID获取流程管理器的ID;

      最后,用该流程管理器来产生流程

4) 启动流程

      wfp.start();

      经过SHARK的几轮跳转,最后的实现在org.enhydra.shark.WfProcessImpl中,实现代码如下:

      //前面有对异常的判断

      //启动时间在后面要用

      startedTime = System.currentTimeMillis();

      //改变状态

         change_state(t,SharkConstants.STATE_OPEN_RUNNING);

         //激活计时器

     this.activateLimitAgent(t);

     //驱动流程

         run(t, null); 

5)断开连接

      disconnect(sc);

      return wfp.key();

Shark流程挂起过程

1)      得到执行管理器接口

ExecutionAdministration ea= Shark.getInstance().getAdminInterface()..getExecutionAdministration();

2)    连接工作流服务器

    ea.connect(username, password, enginename, scope);

3) 用流程实例号获取流程

   WfProcess wfp = ea.getProcess(processInsKey);

4) 挂起流程

   wfp.suspend();

    下面是挂起操作的具体分析

    //状态不能是已经挂起

   if (state(t).equals(SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED)) {

         throw new AlreadySuspended("The process is already suspended");

      }

    //运行中的流程才能挂起

      if (state(t).startsWith(SharkConstants.STATEPREFIX_OPEN_NOT_RUNNING)) {

         throw new NotRunning("The process is not in the running state");

      }

      try {

    //改变状态

         change_state(t,SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED);

 

         Iterator it=getActiveActivities(t).iterator();

         while (it.hasNext()) {

            WfActivityInternal act=(WfActivityInternal)it.next();

    //对每个活动都做同样的操作

            if (act.state(t).startsWith(SharkConstants.STATEPREFIX_OPEN)) {

               act.suspend(t);

            }

         }

      }

5) 断开连接

   ea.disconnect();

Shark流程resume过程

1) 得到执行管理器接口

ExecutionAdministration ea= Shark.getInstance().getAdminInterface()..getExecutionAdministration();

2) 连接工作流服务器

 ea.connect(username, password, enginename, scope);

3) 用流程实例号获取流程

 WfProcess wfp = ea.getProcess(processInsKey);

4) resume流程

 wfp.resume();

 下面是resume操作的具体分析

 //没有挂起的流程不能resume

 if (!state(t).equals(SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED)) {

 throw new NotSuspended("The process is not suspended");

 }

 //源代码中的说明: if this is a subflow process of suspended activity, and it is executed as SYNCHRONOUS, do not allow process to resume

 WfRequesterInternal requester=getRequester(t);

 if (requester!=null && (requester instanceof WfActivityInternal)) {

 WfActivityInternal waImpl=(WfActivityInternal)requester;

 if (waImpl.state(t).equals(SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED)) {

 // Determine subflow type

 if (XPDLUtilities.isSubflowSynchronous(SharkUtilities.getActivityDefinition(t,waImpl,getProcessDefinition(t)))) {

 SharkEngineManager.getInstance().getCallbackUtilities().error("Process"+toString()+" - Cannot resume because the requester activity is suspended");

 throw new CannotResume("Cannot resume - The requester activity is suspended");

 }

 }

 }

 //改变状态

 change_state(t, SharkConstants.STATE_OPEN_RUNNING);

 //把所有的活动都resume

 Iterator it=getActiveActivities(t).iterator();

 while (it.hasNext()) {

 WfActivityInternal act=(WfActivityInternal)it.next();

if (act.state(t).equals(SharkConstants.STATE_OPEN_NOT_RUNNING_SUSPENDED)) {

 act.resume(t);

 }

 }

5) 断开连接

 ea.disconnect();


原创粉丝点击