概 述
你可以从这里找到常见问题的解答。
数据库
Shark 怎样与其他数据库进行配置?
结束安装过程后,你将有已建好的 HipersonicSQL 数据库。这还是比较有用的, Shark 也提供了你其他数据库的选择: DB2, PostgreSQL, MySQL,....
首先你要停止任何可能正在运行的 Shark 实例( POJO swing 管理 /worklist 管理器,或 CORBA 服务器)。
编辑 configure.properties 文件并为属性设置参数:
db_loader_job
目录名包含了 Octopus 装载工作,选项有: db2, hsql, informix, msql, mysql, oracle, postgresql, sybase
db_user
数据库验证用户名
db_passwd
数据库验证密码
db_ext_dirs
包含 JDBC 驱动的 jar 文件目录,如果你需要更多,一个 directory 将被指定 - 通过 ${path.separator} 连接它们
${db_loader_job}_JdbcDriver
要使用的 JDBC 驱动的类名
这些项目都被填入了默认值。
${db_loader_job}_Connection_Url
完整的数据库 URL
这些项目也被填入了默认值。
运行 configure.[bat|sh]
注意
当装载新建的数据库时, Octopus 将抱怨无法卸载索引和表,但这些警告应忽略掉。
怎样清理 Shark 的数据库?
在测试过程中,你想清理数据库并从头开始。为了清理数据库,你可运行 configure.[bat|sh] 文件。如果你不想等待多余的过滤, war 文件存档的话 - 你应该运行 bin/recreateDB.[bat|sh] 文件。
方法稍后只运行 Octopus 装载工作来卸载以及建立表和索引。
怎样调整数据库访问?
Shark 引擎是个组件包,部分利用 DODS 与数据库交互。
似乎有些控制 DODS 特性的参数很难理解。
DatabaseManager.DB.*.Connection.MaxPoolSize
连接池能承受连接的最大数目。如果你知道程序不需要太多并发连接,它可以安全的减少数目。
DatabaseManager.DB.*.ObjectId.CacheSize
作为组分配和保存在内存中的对象标识符数目。这些标识符被指派给新数据对象添加到数据库。
DatabaseManager.defaults.cache.maxCacheSize
根据对象存储的最大数目限制的缓存大小。当缓存已满,缓存中的对象按照 LRU (最近使用)原则被替换为新对象。
DatabaseManager.defaults.cache.maxSimpleCacheSize
DatabaseManager.defaults.cache.maxComplexCacheSize
除了主要对象缓存,还有两种查询缓存可用(简单和复杂)。查询缓存也是 LRU 缓存。
DatabaseManager.defaults.maxExecuteTime
每次运行查询都比 maxExecuteTime 打印到( SQL 语句,执行时间和 maxExecuteTime )日志文件的时间长。这种方式可在你的程序或引擎内部发现很细微的可能问题。
DatabaseManager.DB.sharkdb.Connection.MaxPoolSize=300
DatabaseManager.DB.sharkdb.ObjectId.CacheSize=200
DatabaseManager.defaults.cache.maxCacheSize=100
DatabaseManager.defaults.cache.maxSimpleCacheSize=50
DatabaseManager.defaults.cache.maxComplexCacheSize=25
DatabaseManager.defaults.maxExecuteTime=200
大量的缓存也不总是带来高性能,这将导致内存的浪费和其他问题。
注意
如果你在相同数据库上运行多个引擎实例(例如 集群),那就既不要 DODS 也不要 Shark 缓存。
客户端接口
怎样使用 Shark 库
客户端程序通过 org.enhydra.shark.api.client 包中的一组接口来访问 Shark 库。首先客户端程序应该配置库或通过调用不带参数的 configure() 方法(接着采用 Shark.conf 文件配置的 jar ),或通过指定文件名(做为 String 或 File 对象)或通过准备并调用 Properties 对象方法。配置完毕后 org.enhydra.shark.Shark.getInstance() 返回一个 SharkInterface 实例。从这点开始,客户端程序开发者偏爱(或任务)知道程序怎样使用库,怎样得到连接和执行指派或得到 AdminInterface 以及管理用户、组、包, ...
例子 1. 不是非常有用的 work-list 管理器
例子的第一行,引擎使用 conf/Shark.conf 文件进行配置。当得到连接和成功连接后,引擎获取 Resource 对象,来确定为用户进行了多少指派(第 4 行)。
Shark.configure("conf/Shark.conf");
SharkConnection sConn = Shark.getInstance().getConneciton();
sConn.connect(userId, passwd, engineName, scope);
if (0 < sConn.getResourceObject().how_many_work_item())
System.err.println("Oh, let these tasks wait until tomorrow!");
}
System.out.println("Job done!");
例子 2. 用户组管理
该范例不能运行。如果你把 Shark 配置为使用 LDAP user-group 组件,但是基于组件的数据库开始时确是空的,所以要做任何实际的工作你都需要定义至少一个组和用户。
Shark.configure();
UserGroupAdministration ugAdmin =
Shark.getInstance().getAdminInterface().getUserGroupAdministration()
ugAdmin.crateGroup("developers","sweat-shop");
ugAdmin.createUser("developers", "user", "secret", "Jane Doe", "[email protected]");
System.out.println("Group and user created!");
例子 3. 装载包到 Shark 库
包的 XPDL 文件位置与包知识库的根路径有关。在你执行该操作之前,通过在客户端对象调用 getDefinedPackagesPath() 方法你将得到所有的包相关路径。首先根据包知识库的根路径,找到你需要包的 XPDL 文件位置,接着要有 PackageAdministation 实例。
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[i].activity().key())) {
a = ar[i];
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" ,并且是十分种之前启动,有 3 个以上的激活活动,有叫做 "myvariable" 且值为 "test" 的 String 类型变量的流程。
/*
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 被引入进来了。一个程序(的开发者)会因为多种因素选择使用外部事务,比如使用相同数据库保存程序( work-flow 无关)数据,这是为避免经常构建 / 丢弃事务, font-size: 12pt;
评论