详细h览其官方|址http://www.opencms.org
二?weblogic8下的部v前的准备工作
1。目前稳定版本ؓ6.2.3Q但对应开发者和学习使用的可以下到它的最新开发版?.0版;
2。用eclipse自带的cvs插g下蝲其最新版?
1)cvsroot?font face="Courier New">:pserver:anon@cvs.opencms.org:/usr/local/cvs
2Q密码ؓanon,取分支cvs checkout -r DEV_7_0 opencms可以得到最新源代码.
3. 安装weblogic8Q我使用的是platform812_zh_CN_win32.exe版本?/font>
4. ~省安装完weblogic8后,q行它的配置向导,新徏一个basic weblogic server domainQ域名改名ؓopencms,其它全部采用默认讄完成?/font>
5.weblogic域创建成功后Q缺省在bea安装目录下会生成user_projects\domains\opencms
三。两U部|opencms方式
a)取下来的opencms源码中提供了ant方式Q可以直接生成war包进行部|Ԍ即采用war方式q行部vQ这是最单和最方便的部|方?/font> Q但对于开发者来说这应该是属于产品发布阶段的部|Ԍ因此调试h会很不方便;
b)另一U方式是直接把源代码目录部v到weblogic下,q样可以很方便的q行调试Q由于通过weblogic的控制台只能q行
war和ear的部|Ԍ所以我们只能直接修改它的配|文件进行部|Ӏ?/font>
我们采用W二U方式进行部|?/font>
1。首先在eclipse~译取下来的源码Q由于取下来的源码还需要第三方的jar文gQ如ant.jarQ找到相应的jar文g?/font>
入进来,另外在它的模块文件中q引用了其它的文Ӟ如果定用不上可以先全部删除掉以便可以正编译成功;
2.~译时最好用jdk1.4的版本,或直接用bea自带的jdkq行~译Q一会儿我会说明原因Q?/font>
3.~辑user_projects\domains\opencms\config.xml,d如下内容
<Application Deployed="true" Name="opencms"
Path="D:\eclipse3.2.1\eclipse\workspace\opencms\webapp\.\."
StagedTargets="myserver" TwoPhase="false">
<WebAppComponent DeploymentOrder="1001" Name="opencms"
Targets="myserver" URI="."/>
</Application>
<ApplicationManager Name="opencms"/>
其中Path="xxxx"中的内容Z的opencms实际安装目录
4.修改weblogic启动文guser_projects\domains\opencms\startWebLogic.cmd
引如如下jar文g:
echo CLASSPATH=%CLASSPATH%
set OPEN_CMS=D:\eclipse3.2.1\eclipse\workspace\opencms
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-logging-1.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\activation.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\alkacon-diff-0.9.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\alkacon-simapi-0.9.4.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\ant-contrib-1.0b1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\ant-opencms-1.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-beanutils-1.7.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-codec-1.3.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-collections-3.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-dbcp-1.2.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-digester-1.7.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-email-1.0-mod.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-fileupload-1.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-httpclient-3.0.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\commons-pool-1.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\dom4j-1.6.1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\htmlparser-1.5-20050925.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\jakarta-oro-2.0.8.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\jaxen-1.1-beta-4.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\jstl-1.1.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\jtidy-r8-05102004.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\jug-1.1.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\junit-3-8-1.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\log4j-1.2.9.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\lucene-analyzers-2.0.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\lucene-core-2.0.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\lucene-highlighter-2.0.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\lucene-snowball-2.0.0.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\mail.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\mysql-connector-java-3.1.12-bin.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\PDFBox-0.7.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\pg74.216.jdbc3.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\poi-2.5.1-final-20040804.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\quartz-1.4.5.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\servlet.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\standard-1.1.2.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\atm-extractors-0.4.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\webapp\WEB-INF\lib\xml-apis.jar
5.到目前应该可以运行了Q在q行中可能会出现各种各样的问题(依据取下来的版本Q,按下列方法进行处?
6.点击user_projects\domains\opencms\startWebLogic.cmd启动服务Q观察控制台和user_projects\domains\opencms\myserver下的日志文gQ查看错误提C;
下面是我q行中碰到的错误q行的相应的调整
1)控制台报The WebLogic Server did not start up properly.
java.io.InvalidClassException: javax.management.MBeanAttributeInfo; local class incompatible: stream classdesc serialVersionUID = 7043855487133450673, local class serialVersionUID = 8644704819898565848
错误原因及解军_?/strong>:MBeanAttributeInfo的serialVersionUID的版本控制id不一P说明是用这个被使用的bean被修改过了,很显然是版本不对Q修改startWebLogic.cmd文gQ设|set JAVA_HOME=D:\bea\jdk141_05,使其指向weblogic自带的jdkQ重启startWebLogic.cmd问题消失?/font>
2)错误报Deployment descriptor "web.xml" is malform
ed. Check against the DTD: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find
错误原因及解军_?/strong>:解析web.xml出现问题,修改OPEN_CMS\webapp\WEB-INF\web.xml文gQ在该文件的 最上面d如下内容:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
重新启动错误消失?/font>
3)错误为Deployment descriptor "/WEB-INF/
web.xml" is malformed. Check against the DTD: The content of element type "t
ag" must match "(name,tag-class,tei-class?,body-content?,display-name?,small-ico
n?,large-icon?,description?,variable*,attribute*,example?)". (line 40, column 11
).>
错误原因及解军_?/strong>:׃weblogic8在解析xml文gӞ对xml文g的内Ҏ(gu)式要求特别严|必须按照xml格式的要?/font>
及排列顺序,所以必重新组l其内容Q一定严D注意序Q如 <servlet>׃能放?lt;servlet-mapping>后面?/font>
4)错误java.lang.SecurityException: Prohibited package name: java.lang
错误原因及解军_?/strong>:讉K包可视的Ҏ(gu)或变量错误;q个错误恨少见,一直没有想明白其中~由Q后来只能采用直接引用jar文g的法子解册问题Q?/font>
i)利用opencms自带的build.xml文gQ运行ant jar命oQ生成opencms.jar和webdav.jar两个文g
ii)在startWebLogic.cmdd如下内容Q引q上面的2个jar文g
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\build\opencms.jar
set CLASSPATH=%CLASSPATH%;%OPEN_CMS%\build\webdav.jar
大家有兴的可以参考《透视JAVA——反~译、修补和逆向工程技术》这本书?4.2章的内容Q如果找到更好的解决Ҏ(gu)也请来信告知Q谢谢~_~
5)其它注意事项Q在eclipse下最好采用和q行weblogic一Ljdk版本q行~译Q否则会出现文g讉K版本不一致的bug
7.启动startWebLogic.cmdQ在览器中输入http://127.0.0.1:7001/opencms/setup/
如果在出C面的画面Q则恭喜你,成功了!
原文引用Q?br />http://flylijian.spaces.live.com/
1.
什么是
k-means
聚类法Q?/font>
从网上找C很多定义Q这里选取比较典型的几个;
K-Mean 分群法是一U分割式分群Ҏ(gu)Q其主要目标是要在大量高U的资料点中扑և
h代表性的资料点;q些资料点可以称为群中心Q代表点Q然后再Ҏ(gu)q些
中心,q行后箋的处理,q些处理可以包含
1 Q资料压~:以少数的资料Ҏ(gu)代表大量的资料,辑ֈ资料压羃的功能;
2 Q资料分c:以少C表点来代表特点类别的资料Q可以降低资料量及计量Q?/span>
分割式分法的目的是希望盡量減小每個群聚中Q每一點與中心的距離qx差(square errorQ。?
假設我們現在有一i包?span lang="EN-US">c個群聚的資料Q其中第 k 個群聚可以用集合 Gk來表C,假設 Gk包含nk{?/span>
資料 {x1, x2, ? xnkQ,此群聚中心為ykQ則該群聚的qx?span lang="EN-US"> ek可以定義為:
ek = S i |xi-yk|2 Q其?span lang="EN-US"> xi是屬於第 k 的資料點?span lang="EN-US">
而?span lang="EN-US">c個群聚的^和qx?span lang="EN-US">E便是每個群聚的qx差總和:
E = S k=1~c ek
我們分的Ҏ(gu)Q就變成是一個最?jng)_的問,換句pQ我們要如何選取 c 個群聚以及相關的中心,
使得 E 的值為最?span lang="EN-US">
2 Q处理流E?span lang="EN-US">
Q?/span>
1
Q?/span>
?/span>
c
个数据对象Q意选择
k
个对象作为初始聚cM心;
Q?/span>
2
Q?/span>
循环Q?/span>
3
Q到Q?/span>
4
Q直到每个聚cM再发生变化ؓ止;
Q?/span>
3
Q?/span>
Ҏ(gu)每个聚类对象的均|中心对象Q,计算每个对象与这些中心对象的距离QƈҎ(gu)最距重新对相应对象q行划分Q?/span>
Q?/span>
4
Q?/span>
重新计算每个Q有变化Q聚cȝ均|中心对象Q?/span>
3. java 法的实现说?/span>
1) 假设l点一l?/span> c 点资?/span> X = {x1, ..., xc} Q每一炚w?/span> d l_l定一个群聚的数目 k, 求其
最好的聚类l果?/span>
2 Q?/span> BasicKMeans.java ȝ
int coordCount = 250;// 原始的资料个?/span>
int dimensions = 100;// 每个资料的纬度数?/span>
double[][] coordinates = new double[coordCount][dimensions];
q里假设 c 点资料ؓ coordinates 对象Q其?/span> c ?/span> coordCount,d ?/span> dimensions 相应倹{?/span>
int mk = 30; // 惌聚的数?/span>
Ҏ(gu)聚数目定义 mk 个群聚类对象
mProtoClusters = new ProtoCluster[mK];// ?/span> ProtoCluster c说?/span>
// 首先随机选取 mk 个原始资料点作ؓ聚c?/span>
mProtoClusters[i]= new ProtoCluster (coordinates[j] );//i 依此?/span> 0 ?/span> mk 的| j ?/span> 0 ?/span> coordCount 的?/span>
定义一个变量用于记录和跟踪每个资料点属于哪个群聚类
mClusterAssignments = new int[coordCount];
mClusterAssignments[j]=i;// 表示W?/span> j 个资料点对象属于W?/span> i 个群聚类
// 开始@?/span>
mProtoClusters[i].updateCenter(mCoordinates);// 计算W?/span> i 个聚cd象的均?/span>
采用距离qx差来表示资料点到中心点的距离Q?/span>
//定义一个变量,来表C料点C心点的距?/span>
mDistanceCache = new double[coordCount ][mk];
//其中mDistanceCache[i][j]表示Wi个资料点到第j个群聚对象中心点的距;
//距离法描述():
a)依次取出每个资料点对象double[] coord = coordinates[i];
b)再依ơ取出每个群聚类中的中心点对象double[] center = mProtoClusters[j].mCenter;
c)计算coord对象与center对象之间的距?/font>
double distance(double[] coord, double[] center) {
int len = coord.length;
double sumSquared = 0.0;
for (int i=0; i<len; i++) {
double v = coord[i] - center[i];
sumSquared += v*v; //qx?br /> }
return Math.sqrt(sumSquared);
}
d)循环执行上面的流E,把结果记录在mDistanceCache[i][j]中;
依次比较每个资料点的 最短中心距,
int nearestCluster(int ndx) {
int nearest = -1;
double min = Double.MAX_VALUE;
for (int c = 0; c < mK; c++) {
double d = mDistanceCache[ndx][c];
if (d < min) {
min = d;
nearest = c;
}
}
return nearest;
}
该方法返回该资料点对应的最短中心距ȝ聚cȝ索引|
比较每个 nearestCluster[coordCount] 的值和mClusterAssignments[coordCount]
的值是否相{,如果全相{表C所有的点已l是最佌MQ直接返回;
否则需要重新调整资料点和群聚类的关p,调整完毕后再重新开始@环;
调整旉要更C列数据:
a)更新mProtoClusters[i]中的mCurrentMembership集合Q?/font>
b)更新mClusterAssignments[i]中对应的|
然后重行开始@?/font>
3 Q?/span> ProtoCluster.java 是一个包含代表点的群聚类Q该cL两个最主要的属?代表??中?Q?/span>
int[] mCurrentMembership;// 用于表示每个聚包含的数据资料点集合
double[] mCenter;// 用于表示每个聚类对象的均|也就是中心对?/span>
void updateCenter(double[][] coordinates) {
// 该方法计?/span> 聚类对象的均?/span> ;
// Ҏ(gu) mCurrentMembership 取得原始资料点对?/span> coord Q该对象?/span> coordinates 的一个子集;然后取出该子集的均|
取均值的法很简单,可以?/span> coordinates 惌成一?/span> m*n 的距?/span> , 每个均值就是每个纵向列的取和^均?/span> , 该g
存在 mCenter ?/span>
for (int i=0; i< mCurrentMembership.length; i++) {
double[] coord = coordinates[mCurrentMembership[i]];
for (int j=0; j<coord.length; j++) {
mCenter[j] += coord[j];// 得到每个U向列的和;
}
f or (int i=0; i<mCenter.length; i++) {
mCenter[i] /= mCurrentSize; // Ҏ(gu)个纵向列取^均?/span>
}
}
参考文?/font>Q?a >http://www.javaworld.com/javaworld/jw-11-2006/jw-1121-thread.html
Tomcat5.5.16 部vweb目源码详解
Tomcat.5.5.16 安装 web 目时执行的代码主要?/span> HostConfig c,其中 deployApps() 执行部v web 应用的功能;
protected void deployApps() {
File appBase = appBase();
File configBase = configBase();
// Deploy XML descriptors from configBase
deployDescriptors(configBase, configBase.list());
// Deploy WARs, and loop if additional descriptors are found
deployWARs(appBase, appBase.list());
// Deploy expanded folders
deployDirectories(appBase, appBase.list());
}
从上面这D代码,我们可以知道 tomcat 在部|?/span> web 目是按如下序依次部v的;
1Q?span style="FONT: 7pt 'Times New Roman'"> 首先部v $CATALINA_HOME/conf/Catalina/localhost 目录下面?/span> .xml 文gQ?/span>
deployDescriptors(configBase, configBase.list());
Q?Q?span style="FONT: 7pt 'Times New Roman'"> configBase 的值是通过调用 configBase() 获取的,
File file = new File(System.getProperty("catalina.base"), "conf");
Container parent = host.getParent();
if ((parent != null) && (parent instanceof Engine)) {
file = new File(file, parent.getName());
}
file = new File(file, host.getName());
可以看出 configBase 是由四部分内容组?/span> ;
System.getProperty("catalina.base") + “conf? + parent.getName()+host.getName()
parent.getName() ?/span> host.getName() 是分别取 server.xml ?/span>
<Engine name="Catalina" defaultHost="localhost"> ?/span>
<Host name="localhost" appBase="webapps" ? 对应?/span> name 属性|
由此可以得出 configBase 的gؓ $CATALINA_HOME/conf/Catalina/localhost
(2) 按文件名序依次d configBase 目录下面?/span> xml 文g部v web 应用Q?/span>
W一步,首先获取文g名(不包?/span> .xml Q作Z下文路径
String nameTmp = files[i].substring(0, files[i].length() - 4);
String contextPath = "/" + nameTmp.replace('#', '/');
W二步,解析 xml 文gQ分?/span> docBase 的|
注意q里?/span> docBase 的判断很重要Q采用和以前版本完全不同的做法;
if (!docBase.isAbsolute()) {
docBase = new File(appBase(), context.getDocBase());
}
首先判断 docBase 是否为绝对\径,如果不是l对路径Q在改ؓ
$CATALINA_HOME/webapps+docBase
// If external docBase, register .xml as redeploy first
if(!docBase.getCanonicalPath().startsWith(appBase().getAbsolutePath()))
{
// q个判断很重要,q里是判断如?/span> docBase 路径是以
$ CATALINA_HOME/webapps+docBase 开头的字符Ԍ则忽略掉?/span>
isExternal = true;
...
if (docBase.getAbsolutePath().toLowerCase().endsWith(".war")) {
isWar = true;
}
} else{
// Ignore specified docBase
context.setDocBase(null);
}
从上面可以看出, <Context path="/xxxx" docBase="xxxx" . ?/span> docBase 只有为绝对\径ƈ且该路径不是?/span> $CATALINA_HOME/webapps 开_才会生效Q否则就忽略掉了Q?/span>
2Q?span style="FONT: 7pt 'Times New Roman'"> 接下来部|?/span> $CATALINA_HOME/webapps/ 目录下以?/span> War l尾的文?/span>
deployWARs(appBase, appBase.list());
(1) 首先仍是把文件名 ( 不用 .war) 作ؓ其应用的上下文\?/span> ;
if (files[i].toLowerCase().endsWith(".war")) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i];
int period = contextPath.lastIndexOf(".");
(2) 接下来判断以该上下文路径 contextPath 是否已经装蝲q了Q如果是则直接退出; if (deploymentExists(contextPath))
return;
Q?/span> 3 Q?/span> l箋判断以该上下文命名的部v文g是否存在Q如 war 文g?/span> AAA.war, 则判断在 $CATALINA_HOME/conf/Catalina/localhost/AAA.xml 文g是否存在Q如果不存在l箋执行以下操作Q?/span>
File xml = new File
(configBase, file.substring(0, file.lastIndexOf(".")) + ".xml");
if (deployXML && !xml.exists()) {
entry = jar.getJarEntry(Constants.ApplicationContextXml);
configBase.mkdirs();
。。?/span>
先从 wart 文g中读?/span> META-INF/context.xml 文gQ然后把?/span> copy ?/span>
$CATALINA_HOME/conf/Catalina/localhost/AAA.xml, 注意 war 文g部v文g必须?/span>
context.xml Q且?/font> META-INF 目录下;
Q?/span> 4 Q接下来操作和上面类|部v?/span> web 应用Q?/span>
3. 最后是?/span> $CATALINA_HOME/webapps 目录下的文g夹ؓ目标按文件夹名顺序进行部|Ԍ
deployDirectories(appBase, appBase.list());
Q?Q?span style="FONT: 7pt 'Times New Roman'"> 同样先把该文件夹名作Z下文路径q行部vQ?/span>
File dir = new File(appBase, files[i]);
if (dir.isDirectory()) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i];
Q?Q?span style="FONT: 7pt 'Times New Roman'"> 接下来的步骤基本上是一样了Q首先判断该上下文\径是否已l部|过Q如果是则直接退出,否则和上面一Pd META-INF/context.xml 文gq行部vQ?/span>
注意q里和上面的 war 文g部vE微有点不同Q就是它不会 copy 部v文g context.xml 文g?/span> $CATALINA_HOME/conf/Catalina/localhost 中去Q?/span>
WfRequester is the interface that has a direct concern with the execution and results
of a workflow process - it represents the request for some work to be done. Its
performer, a WfProcess, is expected to handle its request and communicate significant
status changes; in particular to inform the requester when it has completed performing
the requested work. A single requester can have many processes associated with it.
说明Q?/span> WfRequester 接口是一个和工作流E的执行及结果有直接关系的接口;它代表了对一些工作执行的hQ它的一个主要功能是?/span> WfProcess 链接C个其它应用;其中 WfRequester 会关联到多个 WfProcee, ?/span> WfProcess 发生 complete ?/span> terminate ?/span> abort 事g时会通过回调 receiveEvent() Ҏ(gu)来通知 WfRequest Q在 receiveEvent(event) Ҏ(gu)中,参数 event 是一?/span> WfEventAudit 对象Q其?/span> WfEventAudit 中有一个方?/span> source(), 通过q个Ҏ(gu)我们可以得知是哪?/span> WfExecutionObject 对象触发了事件源Q得C WfExcutionObject ?/span> WfProcess 我们也进?/span> 得到了和q个 WfProcess 相关联的其它应用Q?/span>
主要步骤 :
(1) 自定义一个自qcL接口Q如 GenericRequester, q个 GenericRequester cM表用戯定义的一个请求者;
(2) 在启?/span> WfProcess 是,把这个请求者和 WfProcess q行l定注册?/span> WfRequester 中;
?/span> WfReuester ?/span> registerProcess() 是做这个功能,主要代码如下
protected Map performers = null;
public void registerProcess(WfProcess process, Map context, GenericRequester requester){
performers.put(process, requester);
}
(3) 当工作流E在执行的过E中发生 complete ?/span> terminate ?/span> abort 事g时会回调 WfRequest 中的 receiveEvent() Ҏ(gu)Q?/span>
requester.receiveEvent(audit);
(4) ?/span> receiveEvent() 中首先根?/span> WfEventAudit ?/span> source() 获取触发事g?/span> WfProcess 对象Q?/span>
receiveEvent(WfEventAudit event){
// 获取事g?/span> process 对象
WfProcess process = (WfProcess) event.source();
// Ҏ(gu) prcocess 对象获取在注册时l定的自定义h?/span> GenericRequester
GenericRequester req = (GenericRequester) performers.get(process);
// 执行自定义请求者的Ҏ(gu)
req.receiveResult(process.result());
}
其它Q在q里 GenericRequester 也可是一?/span> WfProcess ?/span> WfActivity 对象Q这样可以在 WfProcess 完成操作后又启动另一个子程或某个活动;