Shark包、流程管理
来源:互联网 发布:小白的第一本书python 编辑:程序博客网 时间:2024/06/03 00:01
org.enhydra.shark.SharkEngineManager
SharkEngineManager是shark引擎的控制室,它在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();
}
Shark中RepositoryMgr的实现类是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();
- Shark包、流程管理
- (转)Shark包、流程管理
- Enhydra Shark管理应用程序
- Shark流程跳转的设计
- Enhydra Shark 管理(翻译)
- Android 包管理流程之包的解析
- Shark 工作流研究3-启动流程过程
- pms包管理服务分析-证书校验流程
- pms包管理服务分析-apk卸载流程
- Shark 用户管理以及认证管理实现分析
- shark接口1分析(一)--启动流程
- shark接口1分析(二)--suspend流程
- shark接口1分析(三)--resume流程
- Shark api 应用:获得父流程(parent process)
- Shark api 应用:获得子流程(sub process)
- Shark api 应用:判断流程进行到了哪个活动
- shark接口1分析(三)--resume流程
- shark接口1分析(二)--suspend流程
- 基于第一版Couser框架的项目开工了
- 变动-反馈机制,POSA经典MVC和COM 连接点的一点点比较
- 那些诗篇
- 日期与字符串
- 指针的学习(好文收集)
- Shark包、流程管理
- 写点啥呢?
- 拒绝小肚子10大妙计
- 关于在DataGrid中创建一个弹出式窗口的问题!
- 用Perl:痛并快乐着!!
- 漫谈操作系统
- 好久没有来这里写Blog,主要原因是太慢了,而且有的时候总是打不开。
- 经典QQ资料
- 值得珍藏一辈子的80句话 [转贴]