| green's profile我的共享空间PhotosBlogLists | Help |
|
10/14/2008 无意中浏览到——杨帆公布“杨帆门”真相无意中浏览到——杨帆公布“杨帆门”真相
连接到其博客,看了看,虽然不知道事件的详细起因,但就看其文笔,和陈述事情的方式和态度,引述的事情因尾,七扯八扯,问题出在哪里已经不言自明;
包括谢亚龙等等,我知道什么人在控制着主要局面,我只感到两个字——恶心!
世界因你们而恶心! groove的使用日志groove 2007其实挺好用的,但是也存在几个问题,这里总结一下 1 突然添加了一个150M的文件夹,导致所有其他客户机无相应,估计算法有问题; 2 在无响应情况下结束任务会导致系统崩溃,无法和其他人沟通了;
对于2的解决办法为:备份自己的用户名账户,备份工作空间;执行grooveclean -all 然后再将备份的导入,重新来过即可; 9/22/2008 我好棒哦,哈哈 今天看到敏捷思想中关于团队管理中对于大项目处理方式,和我上一段时间给公司的建议完全一致,哈哈,看来我水平还不错啊?!
想起04年学ipmp的时候,其中的大多数思想都和我想的完全一致——好骄傲(主要原因是以前并没有看过项目管理的书籍),天才!!
————狠狠得夸奖自己一下,鼓励!嘻嘻! 8/24/2007 小乌龟死了 我的小乌龟死了, 死得很安静。。。
最初是眼睛睁不开,并且不吃东西,后来我给买了药,还是比较贵的好药,它似乎不是很喜欢那药,连用了几天,直到有一天,我发现它睁开眼睛了,但是却要死了,肢体很软弱无力,并眼睛已经看不到东西,我知道它要死了,心里有些难过。
可怜的小乌龟,安静的小乌龟。唉!
没得选择,这就是命运。对抗命运最有效的办法就是死亡,死亡--是啊,对于很多生命来说,死亡,何尝不是一种解脱!
尘归尘土归土,祝它在另外一个世界能快乐! 8/7/2007 走过了,体会过了,其他的,都不重要了很久没整理自己将来的目标了,现在整理一下:
想想,应该再做几件事情:
1 继续学习外语
2 构造通用项目框架
3 自己现有的管理和技术经验怎样做才能发挥到最好呢!现在有点浪费了!
还有,有机会好好读读历史和思想大家的著作,包括中外古今的经典,应该读读,减少人生困惑;
也要读一下经典的经济学著作,毕竟生活在社会中,也想多赚点钱,多读读,会清醒些。
再踏踏实实的做点事情吧,虽然知道大多数事情未必会有期望中的回报的,今天的我也不苛求那些了,有便有了,没有也没办法。
低下头辛勤耕作吧,不把收获看得那么重要了。
生活只是过程,走过了,体会过了,就很不错了,其他的,都不重要了。 6/12/2007 firefox和木马firefox浏览器不错,很多居心不良者也发现了,现在网上有很多被二次打包的firefox,还有其他各种伪装方式,里边大都给你带上木马,这很危险,千万注意千万注意 6/11/2007 处分江苏5名官员因无锡水污染事件被处分
■宜兴市周铁镇镇长吴旭
■周铁镇党委副书记、副镇长陈忠强 ■周铁镇环境保护监督管理办公室主任莫小峰 ■宜兴市环保局副局长张盘君 ■宜兴市环保局环境监察大队周铁中队副中队长冯旭东 发现一个现象,为什么都是副的呢,难道现在副职比正职责任大,那权利呢?! 6/1/2007 热门词汇娱乐界常用词汇:
是个歌手就叫巨星;只要不是评委就叫女生或男生;只要是外来的就都叫老师;
商界:
和谎言最接近的词汇有专家、接轨、惯例、为了公众利益
民间:
和谎言最接近的词汇是:马上就给钱;钱对于我们来说不是问题;孩子,我能骗你吗?你看我都这么大岁数了;
公司:
不诚实的公司多半会有这种名字:诚信××、信诚××
个人: 做人啊,这个做人啊。。。(特别要注意年长者,十有八九这个人做人就是有问题) 5/31/2007 大哥,缘分啊 出差到上海,早上去楼下吃自助早餐,看到一个和尚,心中想又是骗子吧,不过早餐虽然不特别贵,但也20元(一般谁花二十元吃早餐呢)呢,心想,和尚啊和尚,外面有太多的受苦受难的人,你不去普渡众生,跑这里奢侈!
我选好食品坐了下来,很快,和尚也和饭店的人打好招呼,说等人,在我前面坐了下来。谈话内容如下:
和尚:“小师主,这么晚才下来吃饭?赫赫!”
我(男一号):“嗯,我睡得晚!”
和尚:“小师主,我告诉你,人生四样东西最重要——健康,快乐,?,?(没记住)”
我(男一号):“哦,谢谢!” 和尚:“小师主,我们在这里见面,算是有缘!”
我(男一号):“嗯!”
我低头吃饭,没理他,过了好一会儿。
和尚:“小师主,你是哪里人!”
我(男一号):“黑龙江!” 和尚:“哦,那很远哦!”
我心里想:看来你可能去过。
我(男一号):“你有事?”
和尚:“我等人,11点在这里见!”
我继续吃。许久。
和尚:“你出差?”
我(男一号):“嗯!”
和尚:“公家的还是私人的?”
我(男一号):“私人!”
“大老板!”和尚竖起拇指说。
我(男一号):“......”,不知怎么回答;
和尚拿出一张名片,“这是我的名片,我们在这里见面,真是有缘”
我接下名片,微微点了点头。看看上面写着:释广喜,中国大九华山佛教会,心想:九华山,难道还有个大九华山?!礼貌性的收了起来。我继续吃。。。
和尚:“你外相不错,命非常好”
我心想,要切入正题了,“哦,是吗?”——我有一搭没一搭的
和尚:“你的眉毛。。。嘴。。。鼻子。。。耳朵。。。”(都是术语,不记得了)
和尚:“但是有一样不好”
“哦?!”我说,心想,流程标准化了,用专业术语那叫——SOP(标准化操作流程)
我说:“是吗?”
和尚:“你先吃先吃,吃完后我再跟你详细说”
我继续吃,一边吃一边想,他这种营销方式,该会用什么样的方式向我要钱呢?终于吃完了!
我抬起头:“您说吧!”
和尚:“你。。。。”(解释我如何如何得好)
和尚:“你有今天,都是前世修来的福气,是你父母留下的”——(妈的,父母都健在,怎么能算是这一辈留下的,可恶)
和尚:“你看那些捡垃圾的,都是前世作孽,今天受苦受累的”——(看来是活该啊,可是人家至少这么艰难没去偷去抢去骗(像他现在做的)啊)
和尚:“但是你性格太善良不够狠,要想成功,我送你三个字:稳、准、狠”--我一听,怎么这么熟啊,似乎从哪里听到过?!好像是什么体育术语?!
和尚:“你很稳,也准但是不够狠”
和尚:“你五年前有一次机会,但是由于你不够狠,所以失掉了”
和尚:“你被小人算计过,都是由于你太善良”,坦白说,我正在内心逐一进行核实印证
可能是和尚太得意了吧,居然去算我的生日,虽然给的是一个范围,但老子的生日把边儿,没蒙对。还有说某年某月某日天气不好,哈哈,错得很,那天出奇的好,看来他今年运气不太好。
和尚:“你看你的眼角,都是不好的东西造成的”——MD,老子天生长这样,居然被用来算命!?“为了防止你被小人算计,我送你一样东西”——一个红布包,里面是ic卡模样的金黄的卡片,很像商场买鞋啦什么的包装盒里边带的那种金色ic卡片。套子上还印着24k金,我一看:到最后一步啦。
街上的一幕幕立刻浮现出来,我立刻还回去说:“要钱吗,要钱就算了!”,他一看对我失败了,立刻收回然后站起来说:“这个可是金的,人家老板都花好几百上千块买呢!”
我没理会:“您还有要说的吗?”
“小师主,我最后告诉你一句话,钱财是身外之物”转身立刻就离开了——真快!我未作任何反应,心想:“钱财也许是我的身外之物,但肯定不是你的身外之物!人渣!”
他站起来找到服务员,继续演戏,说是什么什么肯定有个和尚最近在这里吃过饭什么的,以证明他来这里确实是在等人,而不是来“推销”他所谓的金卡!是啊,终于明白为什么经常看到“和尚”模样的人出入高级或比较的场所,事实上他们很少消费,更多的是在寻找猎物! 中国需要真正的精神领袖 浮躁啊浮躁,可是我们又能怎样呢?!没人愿意浮躁,可是形势却走到了今天这一步。
物质层面一通混战,精神思想层面又一通混战!物质层面的混战是什么都有,精神层面也什么都有。
商战中的英雄不是没有,只是很少,相信很多人也喜欢真正的战斗,如果不是通过真正的战斗赢来的结果,那心中总不是那么有成就感的。
正如股市,昨天的暴跌,凤凰卫视和其他电台不断评价,里边经常出现的词语就是“羊群效应”,其实何止是在暴跌的时候才提到“羊群效应”呢,暴涨的时候何尝不也一样。形势如此,如果自认为头脑足够清醒的话,完全可以混在羊群中,从中渔利,如果你能控制自己,那么你应该不会是羊,但是如果控制不了,那么你就是羊了,最终沦为牺牲品!
“羊群效应”在我们经济生活中的其他方面也比比皆是,所以常常会发现,太多的时候赚钱不是用实力来说话的,而有实力的往往却生不逢时。是什么原因呢,我想也没什么可说的!
但终究我还是要靠实力去战斗,心里不平衡是有的,不和谐也很多,但立足现实,还要踏踏实实一步一步走的。每每和监察部门的人在一起,听他们开会的内容,总让我感觉振奋,感觉又有希望了,说心里话,对于我来讲,没有比“构建和谐社会”更实际更有意义的话了。先勇于面对问题,他反映了一种态度,才能让大家愿意等待。用论坛上的一个惯用语就是,我顶!!
震荡也没什么不好,相当于用筛子筛东西,有时候我们要留下剩在筛子中的,有时候我们要留下筛出去的,不管怎样,还是要分开了清楚些,留下我们要的,去掉我们不要的。
很想远离政治,可是他又和我们息息相关,早在60年代的政治风波就影响我们的家族到现在,到我这一代一样没有完全扭转过来,他如此深刻的影响着我们的生活。
所以更多的时候我们是在等待,在小心观察。对于不能掌控的东西,我们投过去的目光更多是期盼,准确来说应该是企盼吧,然后低下头踏踏实实的工作。
说着说着跑题了,目前我们的危机不仅是诚信的问题。记得过去的几年一直提倡说加强青少年的思想道德教育,成年人都存在问题,真不知如何教育未成年人,从学校里出来的我,没少吃诚信的亏,到现在,虽然不是滑头滑脑的家伙,但是却是非常谨慎的家伙的。人们再提诚信,我都感觉可笑了--可悲啊。好在朋友们彼此还保持诚信的处世方式,那是最后的一片净土,如果这个都没有,人活着得多可怜啊!!可是对于陌生人,除了严谨的控制,我什么都不相信!就这样。
说过诚信,再说道德,林林总总,网路上有各式各样的想法,有的人也许真是思考的结果,有很多人却不是。这里边有真正的英雄,也有浑水摸鱼和哗众取宠者,至少对于我们最好不要轻易评价,也许有一天,其中的某个人可以让我们看清这世界,理顺我们心中的迷惑。
“和尚”也许该靠不住了吧,不知怎么回事,和尚也卷入我们的经济大潮中了,真的和尚也有,假的也有。真和尚进来的结果,只是让我有一种感觉,不知道对不对,就是佛的理论难道只是骗人的把戏不成?!
历史上可以支撑人精神的东西一个个开始土崩瓦解,现在也许我们感觉很乱,也许那正是人们开始觉醒的开始! 5/10/2007 mysql Data truncation错误注意,这是一个关于字符集编码的错误:
大体错误提示应该有这种字样:Data truncation: Data too long for column 'NEWSTRINGVALUE_' at row 1
解释:一般情况下是由于你要加入到对应列的字符集和当时数据库中该列的字符集的字符集编码不一致,如utf-8对应gb2312等等,所以只要调成一致的就可以了。
补充说明:大多数时候,在mysql中建立数据库的时候都会指定字符集,而如果没有特别指定,一般来说,新建的表对应的列也都是取得当前该数据库的默认字符集(mysql在这部分是非常灵活的),所以如果你用jdbc连接过来的话,请注意jdbc中url指定的字符集编码是否和当前数据库字符集一致,否则会有问题的! 5/2/2007 快速安装xwiki记得以往曾经安装过xwiki,现在到了1.0rc3,网络上有一些部署指南,但比较老了,新的方法有所变化
现在比较简单,以tomcat5.5.23为例:
1 解压xwiki-1.0-rc-3.war包中的文件到tomcat的webapp目录下新建的名为xwiki的一个文件夹内
2 建立mysql对应数据库,因为该项目的hibernate默认配置文件中指定的数据库用户名密码都是xwiki,所以干脆也建立一个xwiki数据库,用户名密码也都是xwiki就可以了
3 把web.xml、velocity.properties和xwiki.cfg文件中“ISO-8859-1”替换为“UTF-8”
4 ok了,运行
总结:我没有试验过不建立空的数据库是否可以,有兴趣的可以试验一下,现在xwiki自己可以建立相应的表和初始数据了,这些都不需要我们做了。
不过还有点问题:运行起来控制台提示如下:
com.xpn.xwiki.XWikiException: Error number 3201 in 3: Exception while saving doc
ument XWiki.CalendarEvent Wrapped Exception: Error number 13012 in 3: Exception while saving links Wrapped Exception: null at com.xpn.xwiki.store.XWikiHibernateStore.saveXWikiDoc(XWikiHibernateSt ore.java:314) 我看xwiki自己的jira系统说该bug又打开了,看来以前没解决彻底,没时间了解为什么,等待吧 4/12/2007 jbpm的几个问题(转)1.需要研究出怎样用Struts开发出一套获取用户任务列表的页面。 ----------------------------------------------- JSF是对structs友好的,迁移起来不是很困难的 2.任务的管理需要身份管理。jBPM提供了一套身份管理的机制。但是,显然我们不能把应用程序的身份管理交给jBPM的身份管理模块来维护。我们需要把jBPM的身份管理模块去除,把jBPM的任务和自己应用程序的身份数据库整合起来。 -------------------------------------------------- 这个很好做,task一般都和swimlane挂钩,而jbpm里身份认证只是靠一个actorId,String类型的,可以把用户名或者工号作为actorId,就把你们的身份系统和jbpm结合起来了 swimlane可以用expression解析,也可以用assignmentHandler,用assignmentHandler最简单,可以直接挂接到jbpm外部去查你自己的数据库。而expression却非常方便,可以直接写表达式,但是不幸的是,jbpm号称他的identity 是可插拔的,他的代码却把org.jbpm.identity.ExpressionAssignmentHandler耦合到了他的代码里,竟然是一个 String字符串,他的expression解析最终也是靠那个String forClass出来一个Handler类来处理的。这个时候我们只需要自己重写一个ExpressionAssignmentHandler并且把 JpdlXmlReader里相应的字符串替换掉就可以了,以后你就能在自己的流程文件里写自己定义的表达式,然后使用你自己的身份系统 4.JBoss Seam容器在jBPM中有广泛的应用,也必须加以了解。 ----------------------------------------------- 可以不用了解,jBPM里没有任何seam的代码,jbpm 04年就出来了,而seam也就是最近的事情,JBoss Seam是一个lightweight的符合SOA的框架,jbpm可以作为其中的一部分,也可以单独使用 jbpm也有不完善的地方,比如他对于并发子流程就没有支持,只能靠修改原代码实现 最近才为公司用jbpm做了一套工作流系统,用的C/S架构,有空多交流 jeffreyxu@gmail.com 4/11/2007 第11章 任务管理Jbpm的核心业务是持久化流程执行的能力,对于管理任务和个人任务清单来说这是一个非常重要的特性,Jbpm允许指定一段软件描述所有人的任务中处于等待状态的流程。
11.1 任务
任务是流程定义的一部分,它们定义了在流程执行期间任务实例怎样被创建和分配。
任务可以在task-node和 process-definition中定义,通常使用的方式是在一个task-node里定义一个或多个任务,这种情况下,task-node代表一个将由用户完成的任务,并且流程执行将一直等待直到参与者完成这个任务,当参与者完成任务时,流程执行将继续。当在一个task-node中指定多个任务时,默认的行为是等待所有任务完成。
任务也可以被指定在process- definition。指定在process-definition的任务可以通过名称查找到并且在task-node里引用或者在内部动作中使用。事实上,所有给定名称的任务(包括在task-node中定义的任务)都可以在流程定义(process-definition)中通过名字查找到。
任务名称在整个流程定义中必须是唯一的。任务可以被指定一个优先级,这个优先级在任务的实例创建时将被作为每个任务实例的初始优先级,任务实例的初始优先级可以在以后被修改。
11.2 任务实例
任务实例可以被分配一个actorId(java.lang.String)。所有的任务实例被存储在数据库中的一张表里面(JBPM_TASKINSTANCE),通过查询这张表可以得到给定actorId的所有任务实例,进而获取特定用户的任务清单。
Jbpm的任务清单机制可以组合Jbpm任务和其他任务,甚至那些任务与流程执行毫不相干,这样,Jbpm开发者可以很方便的组合Jbpm流程任务和其他应用的任务到一个集中的任务清单仓库中。
11.2.1 任务实例生命周期
任务实例的生命周期是很直观的:创建后,任务实例可以被随意地开始,然后任务实例可以被结束,这意味着任务实例被标记为完成。
注意,为了灵活性,分配不是生命周期的一部分,所以任务实例可以被分配也可以不被分配,任务实例的分配不会影响任务实例的生命周期。
任务实例典型的创建是通过流程执行进入一个 task-node(使用方法TaskMgmtInstance.createTaskInstance(…)),然后,用户接口组件会使用 TaskMgmtSession.findTaskInstancesByActorId(…)查询数据库获取任务列表,然后,在收集了用户输入后,UI 组件调用TaskInstance.assign(String)、TaskInstance.start()或者TaskInstance.end (…)。
任务实例依靠日期属性维护它的状态:创建、开始和结束。这些属性可以通过任务实例上它们各自的getter方法访问。
通常,完成的任务实例用一个结束日期做了标记,所以它们不能被以后的任务列表查询获取,但是它们仍然存在于JBPM_TASKINSTANCE表中。
11.2.2 任务实例和图执行
任务实例是参与者任务清单(tasklist)中的项目,任务实例可以作为信号,当一个信号任务实例完成时,可以发送一个信号到它的令牌继续流程执行。任务实例可以被阻塞,这意味着在任务实例完成之前相关令牌(=执行路径)不允许离开任务节点。默认情况下,任务实例是信号非阻塞的。
如果多于一个任务实例与一个任务节点关联,流程开发者可以指定任务实例的完成怎样影响流程的继续。下面是可以给任务节点的signal属性设置的值:
l last:这是默认值。当最后一个任务实例完成时继续执行;当在节点入口处没有任务创建时,继续执行。
l last-wait:当最后一个任务实例完成时继续执行;当在节点入口处没有任务创建时,执行在任务节点等待,直到任务被创建。
l first:当第一个任务实例完成时继续执行;当在节点入口处没有任务创建时,继续执行。
l first-wait:当第一个任务实例完成时继续执行;当在节点入口处没有任务创建时,执行在任务节点等待,直到任务被创建。
l unsynchronized:总是继续执行,不管任务是否创建和完成。
l never:执行不再继续,不管任务是否创建和完成。
任务实例可以基于运行时的计算创建,如果那样的话,需要添加一个ActionHandler到任务节点的node-enter事件,并且设置属性create-tasks=“false”。下面是这样一个动作的实现例子:
public class CreateTasks implements ActionHandler {
public void execute(ExecutionContext executionContext) throws Exception {
Token token = executionContext.getToken();
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskNode taskNode = (TaskNode) executionContext.getNode();
Task changeNappy = taskNode.getTask("change nappy");
// 现在, 相同任务的两个任务实例被创建
tmi.createTaskInstance(changeNappy, token);
tmi.createTaskInstance(changeNappy, token);
}
} 如示例所展示,任务可以在指定的任务节点中创建,它们也可以被指定到process-definition,并且从TaskMgmtDefinition获取。TaskMgmtDefinition用任务管理信息扩展了ProcessDefinition。
标识任务示例完成的API是TaskInstance.end(),你可以在end方法中指定一个转换,如果这个任务的完成会触发继续执行,则会通过指定的转换离开任务节点。
11.3 分配
流程定义包含任务节点,任务节点(task-node)包含一个或多个任务,任务作为流程定义的一部分是静态描述。在运行时,任务导致任务实例的创建,一个任务实例对应某人任务列表中的一个入口。
在Jbpm中,可以结合使用推模式和拉模式(见下文)的任务分配。流程可以计算任务的责任人,并把它推到他/她的任务清单里;或者,任务可以被分配到参与者池,这种情况下,池中的每个参与者都可以拉出任务并把它放入参与者的个人任务清单。
11.3.1 分配接口
通过接口AssignmentHandler进行任务实例分配:
public interface AssignmentHandler extends Serializable {
void assign( Assignable assignable, ExecutionContext executionContext );
} 当任务实例被创建时分配处理的实现被调用,在那时,任务实例可以被分配到一个或多个参与者。AssignmentHandler实现将调用分配方法(setActorId或 setPooledActors)分配任务,可以分配一个任务实例或者一个泳道实例swimlaneInstance(=流程角色)。
public interface Assignable {
public void setActorId(String actorId);
public void setPooledActors(String[] pooledActors);
} 任务实例和泳道实例都可以被分配到一个用户或者共享参与者。分配任务实例到一个用户,调用Assignable.setActorId(String actorId);分配任务实例到候选的共享参与者,调用Assignable.setPooledActors(String[] actorIds)。
流程定义中的每个任务都可以与一个分配处理实现相关联,用来完成运行时的任务分配。
当流程中的多个任务将要分配给相同的人或者参与者组时,考虑使用泳道。
考虑到AssignmentHandler的重用,每个AssignmentHandler的使用可以在processdefinition.xml中配置。请参考“16.2 委托”了解怎样添加分配处理配置的更多信息。
11.3.2 分配数据模型
下面是管理分配任务实例和泳道实例到参与者的数据模型,每个任务实例拥有一个actorId或一组被共享的参与者。
![]() 图 11.1 分配模型类图
actorId对任务负责,而共享的参与者表示候选者集合,如果它们获取任务,则可以负责任务。actorId和共享参与者具体使用哪个是可选的,两者也可以结合使用。
11.3.3 推模式
任务实例的actorId表明对给定任务负责,而任务实例的共享参与者是任务的候选参与者。典型情况下,任务实例的actorId指向一个用户,共享参与者可以指向多个用户和/或用户组。
用户的任务清单是所有以用户作为actorId的任务实例,这个清单可以使用TaskMgmtSession.findTaskInstances(String actorId)获得。
11.3.4 拉模式
另一方面,共享的任务(译者注:共享任务即不仅是由一个用户负责的)是提供给共享参与者中所引用的用户的。获取共享任务一般需要两步操作:1)从身份组件中获取给定用户的所有组2)为结合了用户的 actorId和指向用户组的actorId获取所有共享任务清单(译者注:这段话不太好理解,解释如下――任务指向一个actorId,在Jbpm中并没有强制限制该actorId必须为单个用户或者用户组,所以我们在实际应用中也可以把actorId作为一个用户组。假如有一个用户为user1,他属于用户组group1,在流程中有些任务分配到了user1,而其它又有些任务分配到了group1,如果我们要取user1的所有共享任务,则即需要获取分配到user1的共享任务,也需要获取分配到group1的共享任务)。可以使用方法 TaskMgmtSesion.findPooledTaskInstances(String actorId)或TaskMgmtSession.findPooledTaskInstances(List actorIds)获取提供给指定用户的共享任务清单,这些方法会返回actorId为空(null)以及共享参与者中某个与给定的actorIds中的某个相匹配的任务实例。
为了防止多个用户在同一个共享任务上工作,使用用户的actorId修改任务实例的actorId就可以了。这样,任务实例将不会出现在共享任务清单中,而只会存在于用户个人的任务清单里。设置任务实例的actorId为空(null),则会把任务实例放回共享任务里。
11.4 任务实例变量
任务实例可以拥有它自己的变量,并且也可以“看到”流程变量。任务实例通常是在执行路径(=令牌)中创建,与令牌之间的父子关系相似,这会在令牌和任务实例之间创建一个父子关系。正常的范围规则适用于相关令牌的任务实例变量和流程变量之间,有关范围的更多信息可以在“10.4 变量范围”找到。
这意味着任务实例可以“看到”它自己的变量,另外还有它所关联令牌的所有变量。
控制器可以用来在任务实例范围和流程范围的变量间创建、组装和提交变量。
11.5 任务控制器
在任务实例创建时,任务控制器可以组装任务实例变量,并且当任务实例完成时,任务控制器可以提交任务实例的数据到流程变量。
注意,任务控制器不是强制使用的,即使不使用任务控制器,任务实例也能够“看到”与它的令牌相关的流程变量,当你想要做如下事情时使用任务控制器:
l 在任务实例中创建变量的拷贝,这样任务变量的中间更新不会影响到流程变量,而是直到处理完成后拷贝才被提交回流程变量。
l 任务实例变量与流程变量不是一一对应的。例如,假设流程有变量“sales in januari”“sales in februari”和“sales in march”,而任务实例所使用表单可能需要显示的是三个月的平均销售量。
任务用来收集用户输入,但是目前有很多可以向用户展示任务的用户接口,例如web应用、swing应用、及时消息、电子邮件表单…因此任务控制器在流程变量(=流程上下文)和用户接口应用之间起到了桥的作用,任务控制器为用户接口应用提供流程变量的视图。
任务控制器在流程变量到任务变量之间进行转换(如果需要)。当任务实例被创建时,任务实例负责从流程变量提取信息,并且创建任务变量,任务变量作为用户接口表单是输入,并且用户输入可以存储在任务变量里;当用户结束任务时,任务控制器负责基于任务实例数据更新流程变量。
![]() 图 11.2 任务控制器
简单的情形是,在流程变量和表单参数之间是一对一的映射,任务控制器在task元素中指定,这种情况下,默认的Jbpm任务管理器可以被使用,它包含一个variable元素列表,variable元素表示流程变量怎样被拷贝到任务变量。
下面的例子展示了怎样基于流程变量的拷贝创建任务实例变量:
<task name="clean ceiling">
<controller>
<variable name="a" access="read" mapped-name="x" />
<variable name="b" access="read,write,required" mapped-name="y" />
<variable name="c" access="read,write" />
</controller>
</task> name属性指向流程变量的名称,mapped-name属性是任意的,用来指向任务实例变量的名称。如果忽略mapped-name属性,则mapped-name默认与name属性相同。注意,mapped-name也被用来在web应用中作为任务实例表单的域标签。
access属性指定了如果在任务实例创建时变量被拷贝,是否需要在任务结束时把它写回流程变量。这个信息可以被用户接口所使用,进行适当的表单控制。access属性是可选的,默认值是“read,write”。
任务节点(task-node)可以拥有多个任务,而开始状态(start-state)只能有一个任务。
如果在流程变量和表单参数之间简单的一对一映射太过约束,你也可以编写你自己的TaskControllerHandler实现,下面是TaskControllerHandler接口:
public interface TaskControllerHandler extends Serializable {
void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
} 下面展示了怎样在任务中配置你自己定制的任务控制器:
<task name="clean ceiling">
<controller class="com.yourcom.CleanCeilingTaskControllerHandler">
-- here goes your task controller handler configuration --
</controller>
</task> 11.6 泳道(swimlane)
泳道是流程角色,它是定义流程中的多个任务由相同参与者完成的一种机制。在第一个任务实例为指定泳道创建后,参与者将被流程记住,以被在同一泳道中的后续任务所使用。泳道有一个分配,因此所有引用泳道的任务不需要再指定分配。
当给定泳道的第一个任务被创建时,泳道的 AssignmentHandler被调用,Assignable被传递到AssignmentHandler,将会成为泳道实例(SwimlaneInstance)。需要知道的是,给定泳道中的所有任务实例的分配都被传播到泳道实例,这个行为是被作为默认实现的,因为获取任务进行处理的人在履行某个流程角色(译者注:也就是说在某个泳道内),因此所有后续对泳道的任务实例的分配会自动转到用户。
泳道是从UML活动图中借来的术语。
11.7 开始任务中的泳道
泳道可以与开始任务关联,用以捕获流程的发起者。
任务可以在start-state中指定,该任务与泳道关联,当这个任务的一个新的任务实例被创建时,当前已经过鉴定的参与者可以使用 Authentication.getAuthenticatedActorId()(参考17.2 鉴定)获取(译者注:这时创建开始任务时,自动进行的),并且该参与者存储在开始任务的泳道里。
例如:
<process-definition>
<swimlane name='initiator' />
<start-state>
<task swimlane='initiator' />
<transition to='...' />
</start-state>
...
</process-definition> 象其它任何任务一样,也可以向开始任务添加变量用来定义与任务关联的表单。请参考“11.5 任务控制器”。
11.8 任务事件
任务可以拥有所关联的动作。任务有四个标准的事件类型定义:task-create,task-assign,task-start,和task-end。
当一个任务实例被创建时task-create事件被激活。
当一个任务实例被分配时task-assign事件被激活。注意:在这个事件中执行的动作里,你可以用executionContext.getTaskInstance().getPreviousActorId()访问前一个参与者。
当TaskInstance.start()被调用时task-start事件被激活。这可以被用来标识用户在这个任务实例上已经开始工作。是否开始一个任务是可选的。
当TaskInstance.end()被调用时task-end事件被激活。这标志了任务的完成,如果任务与流程执行相关,这个调用会触发流程继续执行。
因为任务可以拥有事件以及相关联的动作,所以异常处理也可以在任务上被指定。有关异常处理的更多信息,请参考“9.7 异常处理”。
11.9 任务定时器
在节点上,定时器可以在任务上被指定。请参考“12.1 定时器”。
对于任务的定时器需要指明的是:任务定时器的 cancel-event可以被定制。默认情况下,当任务被结束时(=完成)任务上的定时器将被取消,在是通过在定时器上使用cancel-event属性,流程开发者可以定制诸如task-assign或task-start。cancel-event支持多个事件,通过在属性中指定一个用逗号分割的列表,可以组合cancel-event的类型。
11.10 定制任务实例
任务实例可以被定制。最简单的方式就是创建 TaskInstance的子类,然后创建一个org.jbpm.taskmgmt.TaskInstanceFactory的实现,并在 jbpm.cfg.xml中设置配置属性jbpm.task.instance.factory为该实现的完整类名。如果你使用一个 TaskInstance的子类,还需要为该子类创建一个hibernate映射文件(使用hibernate的extends=” org.jbpm.taskmgmt.exe.TaskInstance”),然后在hibernate.cfg.xml中添加该映射文件到映射文件列表。
11.11 身份组件
用户、组和权限管理一般都被称为身份管理。Jbpm包含了一个可选的身份组件,它可以很容易的被企业自己的身份数据存储所替换。
Jbpm的身份管理组件包含了组织知识模型。任务分配典型的需要由组织知识来完成,因此,这意味着组织知识模型描述了用户、组、系统以及它们之间的关系。作为可选的,权限和角色也可以被包含进组织模型。数个学术研究尝试的失败表明,没有一个通用的组织模型可以适用于所有组织。
Jbpm的作法是定义一个参与者作为流程的实际参与者,参与者通过它的ID进行标识,称为actorId,Jbpm只知道actorId并且为了灵活性用java.lang.String表示,因此任何组织模型知识及其数据结构都在Jbpm核心引擎之外。
作为对Jbpm的扩展,我们将提供(以后)管理简单的“用户-角色”模型的组件,用户和角色之间的多对多关系与J2EE和servlet规范中定义的模型是一致的,这可以作为一个新的开发起点,感兴趣的话可以查看jboss jbpm jira中的问题跟踪来获取更多详细资料。
注意,实际被用在servlet、ejb和portlet规范中的“用户-角色”模型不足以满足任务的分配处理,该模型在用户和角色之间是一个多对多的关系,不包括流程中用户有关的组和组织结构信息。
11.11.1 身份模型
![]() 图 11.3身份模型类图
黄色的类是下面将要讨论的有关表达式分配处理的相关类。
User表示用户或服务。Group是任何类型的用户组,Group可以被嵌套,用来建模一个团队、一个业务单元、以及整个公司的关系,组有类型,用来在不同等级的组之间进行区分,例如 haircolor组。Membership表示用户和组之间的多对多关系,membership可以被用来表示公司中的一个职位,membership 的名字可被用来表示用户在组中的角色。
11.11.2 分配表达式
随同身份组件提供了一种实现,即在进行任务分配期间通过表达式计算参与者。这里有一个在流程定义中使用分配表达式的例子:
<process-definition>
...
<task-node name='a'>
<task name='laundry'>
<assignment expression='previous --> group(hierarchy) --> member(boss)' />
</task>
<transition to='b' />
</task-node>
... 分配表达式的语法如下:
first-term --> next-term --> next-term --> ... --> next-term
where
first-term ::= previous |
swimlane(swimlane-name) |
variable(variable-name) |
user(user-name) |
group(group-name)
and
next-term ::= group(group-type) |
member(role-name) 11.11.2.1第一术语first-term
表达式以从左到右的顺序被分解,first-term指定了身份模型中的一个用户或组,后续的术语的计算基于这个中间的用户或组。
privious的意思是任务被分配到当前已被鉴定的参与者,这意味着参与者完成了流程中的前一个步骤。
swimlane(swimlane-name)的意思是用户或组从指定的泳道实例中取得。
variable(variable-name)的意思是用户或组从指定变量实例中取得。变量实例可以包含一个java.lang.String,这种情况下,用户或组从身份组件获取;或者变量实例包含一个用户或组对象。
user(user-name)的意思是给定的用户从身份组件中取得。
group(group-name)的意思是给定的组从身份组件中取得。
11.11.2.2第二术语next-term
group(group-type)获取用户的组,这意味着前一个术语必须结果为一个用户,这个术语会使用给定的group-type在所有的membership中为用户搜索组。
member(role-name)从组里得到用户所履行的角色,前一个术语必须结果为一个组,这个术语在组中为用户搜索与给顶的role-name相匹配的membership。
11.11.3 移除身份组件
当你想要为组织信息使用自己的数据源时,例如你们公司的用户数据库或者ldap系统,你可以拔除身份组件,你唯一要做的就是在hibernate.cfg.xml中删除下面的行…
<mapping resource="org/jbpm/identity/User.hbm.xml"/>
<mapping resource="org/jbpm/identity/Group.hbm.xml"/>
<mapping resource="org/jbpm/identity/Membership.hbm.xml"/> ExpressionAssignmentHandler 依赖于身份组件,因此你将不能使用它。万一你想重新使用ExpressionAssignmentHandler并且绑定它到你自己的用户数据存储,你可以从ExpressionAssignmentHandler继承并且重写getExpressiontSession方法。
protected ExpressionSession getExpressionSession(AssignmentContext assignmentContext); 4/5/2007 JDBC Thin for All Platforms
16位德国JAVA专家在一起讨论“在下面12个月中,我们应该学习什么?
原文: 4/3/2007 jira安装配置花了点时间安装配置了jira,暂时用的数据库是mysql5.0.37,web服务器是tomcat5.5.23;
记录一下吧,省着将来忘记!
1 解压下载下来的压缩包atlassian-jira-enterprise-3.8
2 下载http://ibiblio.org/maven/xerces/jars/xercesImpl-2.4.0.jar和http://ibiblio.org/maven/xml-apis/jars/xml-apis-1.0.b2.jar 并且复制到tools/ant/lib/下
3 编辑'edit-webapp/WEB-INF/classes/entityengine.xml'文件
<datasource name="defaultDS" field-type-name="mysql"
这个地方还有一句话来着,叫做schema-name="PUBLIC",一定要去掉,因为是给hsql用的(我就忘记了)
...
...
</datasource> 4 在解压后目录的根目录下执行‘build war’,没错就对了,有错应该是jdk什么的一些基本问题,自己找答案吧
5 如果没有问题解压生成的war包到${catalina.home}/webapps/jira下(个人喜好!)
5 看这个网址http://www.atlassian.com/software/jira/docs/v3.8/servers/index.html(如果你用的不是tomcat5.5.x的话)
6 复制dist-tomcat/tomcat-5.5/jira.xml到conf/Catalina/localhost/下(我想弄到tomcat6下来着,但是没有这个目录,待我研究研究),修改jira.xml文件:
如果用的不是hsql,需要去掉minEvictableIdleTimeMillis和timeBetweenEvictionRunsMillis属性
<Context path="/jira" docBase="${catalina.home}/webapps/jira" debug="0">
<Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource" username="jirauser" password="1" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/jiradb?autoReconnect=true&useUnicode=true&characterEncoding=UTF8"/> <Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"
factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/> <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/> </Context>
7 上面是在配置数据库,所以jdbc引擎需要的,复制对应的版本到tomcat的lib下
8 jira-jars-tomcat5.zip文件需要下载下来,也解压jar到tomcat的lib下
9 修改tomcat的conf/server.xml(>5.5.15以上适用)
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"/>10 发布看看,应该可以,也许还有问题,到时候我会继续补充的,呵呵! 关于破解保密,呵呵,自己想办法吧 补充:
1 不知道怎么配置tomcat6的连接池,或者是配置对了但也不行,不去细细研究了,毕竟还有更重要的事情要做;
2 导入bugzilla的数据时候,看到标题就是乱码,不知道为什么!查看了网络上的资料,说是要改源程序,作罢!无所谓
|
|
|