例2:用户、组管理
这个例子既不能在LDAP组件下运行,也不能在基于数据库组件为空时运行,你至少拥有一个组和一个用户的情况下才能运行。
Shark.configure();
UserGroupAdministration ugAdmin =
Shark.getInstance().getAdminInterface().getUserGroupAdministration()
ugAdmin.crateGroup("developers","sweat-shop"); ugAdmin.createUser("developers", "user", "secret", "Jane Doe", "some@email.address"); System.out.println("Group and user created!");
例3:向shark库中加载包
XPDL文件包的位置和知识库包的根目录是有关的。在你执行这个操作以前,你可能想通过调用getDefinedPackagesPath()方法在你的客户端对象中得到所有的相关路径。
首先,你需要得到XPDL文件相对于知识库根路径的位置,然后,你需要一个PackageAdmininistration实例。
String xpdlName = "test.xpdl";
Properties props = new Properties();
props.setProperty("enginename","testSharkInstance"); props.setProperty("EXTERNAL_PACKAGES_REPOSITORY","c:/Shark/repository/xpdls"); Shark.configure(props);
String pkgId = Shark.getInstance().getRepositoryManager().getPackageId(xpdlName);
PackageAdministration pa = Shark.getInstance().getAdminInterface().getPackageAdministration();
if (!pa.isPackageOpened(pkgId)) { pa.openPackage(xpdlName);
}
System.out.println("Package " xpdlName " is loaded");
例4:创建或者开始一个流程
在将xpdl文件加载到shark以后,让我们创建,初始化变量值,启动一个基于xpdl定义的流程。
String pkgId="test";
String pDefId1="basic";
String pDefId2="complex";
SharkConnection sConn=Shark.getInstance().getConnection();
sConn.connect("user","secret","","");
WfProcess proc1=sConn.createProcess(pkgId,pDefId1);
WfProcess proc2=sConn.createProcess(pkgId,pDefId2);
proc1.set_process_context("test_var","This is String variable defined in XPDL for the process basic"); proc2.set_process_context("counter",new Long(55));
proc1.start();
proc2.start();
例5:设置变量
在成功地连接上shark,获得分配列表以后,让我们做点有用的事,像设置变量和完成活动。
/*
SharkConnection sConn;
String activityId;
String vName;
String vValue;
*/
WfAssignment a = null;
WfAssignment[] ar = sConn.getResourceObject().get_sequence_work_item(0);
for (int i = 0; i < ar.length; i) { if (activityId.equals(ar.activity().key())) { a = ar;
break;
}
}
if (null == a)
throw new BaseException("Activity:" activityId
" not found in "
sConn.getResourceObject().resource_key()
"'s worklist");
if (!a.get_accepted_status())
throw new BaseException("I don't own activity " activityId); Map _m = new HashMap();
WfActivity activity = a.activity();
Object c = activity.process_context().get(vName);
if (c instanceof Long) { c = new Long(vValue);
} else { c = vValue;
}
_m.put(vName, c);
activity.set_result(_m);
activity.complete();
例6:得到基于一些标准的流程管理器
这个例子演示了如何得到基于一些标准的流程管理器。他将尝试得到包Id为“test”的,状态为enabled的所有流程的管理器。
ExecutionAdministration eAdmin=Shark.getInstance().getAdminInterface().getExecutionAdministration();
eAdmin.connect("user","secret","","");
WfProcessMgrIterator pmi=eAdmin.et_iterator_processmgr();
query="packageId.equals(\"test\") && enabled.booleanValue()";
pmi.set_query_expression(query);
WfProcessMgr[] procs=pmi.get_next_n_sequence(0);
例7:得到基于一些标准的流程
这个例子演示了如何得到基于一些标准的流程管理器创建的流程,它将试图得到所有的状态为:”open running”,创建时间为最近10分钟,活动的活动数超过3个的流程。他的String变量myvariable的值为test
/*
WfProcessMgr mgr;
*/
WfProcessIterator wpi=mgr.get_iterator_process ();
query="state.equals(\"open.running\") && startTime.longValue()>(java.lang.System.currentTimeMillis()-10*60*1000) && activeActivitiesNo.longValue()>3 && context_myvariable.equals(\"test\")";
wpi.set_query_expression(query);
WfProcess[] procs=wpi.get_next_n_sequence(0);
例8:使用外部事物
每一个Shark API方法调用都使用独立的事物,引擎内部创建,使用,提交,最后释放事物。这意味着即使是非常简单的代码应用,shark也会不自觉地使用了很多事物。
有时,做一件事情有点不同是必要的,因此,SharkTransaction被介入。一个应用程序开发者可能会有很多理由来选择外部的事物,包括用同一个数据库存储应用程序数据的方法,以避免经常地创建/销毁事物……
当然,这种处理带来了一个代价,:你必须服从用法的规则。Transaction被调用Shark.getInstance().createTransaction();方法创建。在你释放他之前,你的应用程序必须调用Shark.getInstance.unlockProcesses(st);来通知shark做内部登记。如果有任何错误出现,你必须捕捉这个抛出,然后调用Shark.getInstance().emptyCaches(st);是的,在你正确地读他时,错误必须被捕捉到,另外你将允许引擎处在为定义状态下。
下面是一个修改一个单独事务中的变量的例子。
/*
SharkConnection sConn;
String activityId;
String vName;
String vValue;
*/
SharkTransaction st = Shark.getInstance().createTransaction();
try {
WfAssignment a = null;
WfAssignment[] ar = sConn
.getResourceObject(st)
.get_sequence_work_item(st, 0);
for (int i = 0; i < ar.length; i) {
if (activityId.equals(ar.activity(st).key(st))) {
a = ar;
break;
}
}
if (null == a)
throw new BaseException("Activity:"
activityId
" not found in "
sConn.getResourceObject(st).resource_key(st)
"'s worklist");
if (!a.get_accepted_status(st))
throw new BaseException("I don't own activity " activityId);
Map _m = new HashMap();
WfActivity activity = a.activity(st);
Object c = activity.process_context(st).get(vName);
if (c instanceof Long) {
c = new Long(vValue);
} else {
c = vValue;
}
_m.put(vName, c);
activity.set_result(st, _m);
activity.complete(st);
st.commit();
} catch (Throwable t) {
Shark.getInstance().emptyCaches(st);
st.rollback();
if (t instanceof RootException)
throw (RootException)t;
else
throw new RootException(t);
} finally {
try { Shark.getInstance().unlockProcesses(st);} catch (Exception _){}
st.release();
}
XPDL流程定义
(你可以通过我们提供的XPDL编辑器JaWE非常容易地创建XPDL文件)
如何为一个活动写一个最后期限异常?
在shark中,最后期限异常和所有的流程变量一样,你可以使用这个特殊变量。这个变量的java类型为java.util.Date,下面是他们的描述:
lPROCESS_STARTED_TIME-流程开始时间
lACTIVITY_ACTIVATED_TIME-工作流流程中的活动或者分配创建的时间
lACTIVITY_ACCEPTED_TIME-活动中第一个分配被接受的时间
注意:
如果一个活动在接受之后被拒绝了,或者他从来就没被接受,ACTIVITY_ACCEPTED_TIME 将被设置成最大值。
下面是当最后期限异常被创建时的一些规则:
l最后期限异常一定能得到一个java.util.Date结果。
l如果shark被安装为不做最后期限评估,但是初始化最后期限限制时间评估,则ACTIVITY_ACCEPTED_TIME在异常中部能够被使用,因为他在将来将包含最大值。
l这里不因该有流程变量(XPDL中的DataField或者FormalParameter实体),他们有相同的ID。
下面是最后期限异常的一些例子:
// Deadline limit is set to 15 secunds after accepting activity
var d=new java.util.Date();
d.setTime(ACTIVITY_ACCEPTED_TIME.getTime() 15000);
d;
// Deadline limit is set to 5 minutes after activity is started (activated)
var d=new java.util.Date();
d.setTime(ACTIVITY_ACTIVATED_TIME.getTime() 300000);
d;
// Deadline limit is set to 1 hour after process is started
var d=new java.util.Date();
d.setTime(PROCESS_STARTED_TIME.getTime() 3600000);
d;
在shark admin应用中,如何写扩展属性使其能够更新和查看活动变量
为了在shark admin应用程序中更新活动变量(被XPDL定义),XPDL活动定义必须包含一些预定义的扩展属性。假如XPDL流程定义包含变量(XPDL DataField tag)叫作“x”,并且变量(XPDL FormalParameter 类型)叫作”input_var”。如果当活动执行时,你是一个admin用户,你能够查看这些变量,你应该定义如下的活动扩展属性:
如果你想让用户更新相同的变量,你应该定义如下的活动扩展属性:
在shark中如何写一个XPDL是用户使用自定义JAVA类
为了实现这个功能,你应该定义变量作为XPDL的外部参考,并且设置它的属性位置和你想使用的类的全名,像这样:
可能一个好的方法是定义一个类型声明元素,如果那样的话,你能够在任何地方使用它(在创建应用程序或者子流程的FormalParameters时,你不需要时间去定义适当的数据类型)然后定义DataField或者FormalParameter如下所示:
被外部引用元素指定的类必须在shark的classpath中。
在XPDL中如何定义一些变量的初始化值为空
你应该在DataField的InitialValue元素中简单地付值:
null
这能够使你使用java接口或者抽象类来作为工作流变量。而这些变量的具体实现将被一些公具代理创建。
如何制定脚本语言
目前shark指定了三种脚本语言解释程序:javascript,BeanShell和Python(最后一种没有完全测试)。为了告诉shark使用的是哪种脚本语言解析条件表达式,你应该指定包的脚本元素:
# if you want to use java-like syntax (interpreted by BeanShell), specify: