jbpmsshdejutiyongfa.docx
《jbpmsshdejutiyongfa.docx》由会员分享,可在线阅读,更多相关《jbpmsshdejutiyongfa.docx(15页珍藏版)》请在冰豆网上搜索。
jbpmsshdejutiyongfa
ok,假定你已经把项目跑起来了吧。
先以管理员manager登录系统,管理员具有添加新文章类型的权限。
当你添加一个文章类型后,需要指定该类型的文章到时候是按哪个流程来进行审批的。
你需要上传一个zip格式的流程定义文件文件(其中压缩了gpd.xml,
processdifinition.xml,和processimage.jpg)。
点击发布,系统转到articletypeaddsub.do,执行ArticleTypeAddSubAction.java
......
importorg.jbpm.JbpmConfiguration;
importorg.jbpm.JbpmContext;
importorg.jbpm.graph.def.ProcessDefinition;
........
/**
*
*增加文章类型操作Action类
*
*@struts.actionpath="/articletypeaddsub"scope="request"validate="false"
*/
publicclassArticleTypeAddSubActionextendsAction{
privatestaticfinalLoglog=LogFactory.getLog(MainAction.class);
/**
*JBPM服务接口实现对象
*/
privateJbpmConfigurationjbpmConfiguration; //参见spring的配置文件applicationContext.xml
/**
*文章类型服务接口实现对象
*/
privateArticleTypeServicearticleTypeService;
/**
*Methodexecute
*
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@returnActionForward
*/
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
log.debug("MainAction.execute()");
UploadDeployFormtheForm=(UploadDeployForm)form;
FormFilefile=theForm.getFiles();//取得上传的文件
//得到JBPM环境
JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();
try{
//解压zip文件流
ZipInputStreamzipInputStream=newZipInputStream(file
.getInputStream());
ProcessDefinitionprocessDefinition=ProcessDefinition
.parseParZipInputStream(zipInputStream);
//发布流程文件
jbpmContext.deployProcessDefinition(processDefinition);
jbpmContext.close();
zipInputStream.close();
//增加文章类型
ArticleTypearticleType=newArticleType();
articleType.setPdName(processDefinition.getName());
articleType.setTypeName(theForm.getTypeName());
articleTypeService.addArticleType(articleType);
}catch(IOExceptione){
log.error("exception",e);
}
request.setAttribute("success","发布成功");
returnmapping.findForward("success");
}
/**
*得到JBPM服务接口实现对象
*@returnjbpmConfiguration
*/
publicJbpmConfigurationgetJbpmConfiguration(){
returnjbpmConfiguration;
}
/**
*设置JBPM服务接口实现对象
*@paramjbpmConfiguration
* 要设置的jbpmConfiguration
*/
publicvoidsetJbpmConfiguration(JbpmConfigurationjbpmConfiguration){
this.jbpmConfiguration=jbpmConfiguration;
}
/**
*得到文章类型服务接口实现对象
*@returnarticleTypeService
*/
publicArticleTypeServicegetArticleTypeService(){
returnarticleTypeService;
}
/**
*设置文章类型服务接口实现对象
*@paramarticleTypeService要设置的articleTypeService
*/
publicvoidsetArticleTypeService(ArticleTypeServicearticleTypeService){
this.articleTypeService=articleTypeService;
}
}
执行到这步后,你可以去查看下数据库中表jbpm_processdifinition,你会发现表中多出里一条记录,并且名字就是你上传的压缩文件中processdifinition.xml中的name属性的值。
其他的表也会有相应的变化,具体看字段的定义就会大概明白了。
好了,流程已经发布到了系统中了。
当然你还可以增加其他的文章类型并且指定不同的流程定义。
我们退出系统,以guest用户登录系统,然后编写文章,这里需要说明的是,当你选择不同的文章类型后,该文章的审批过程就会与你刚才定义的执行流程相关了。
点击保存,
系统调用的ACTION为:
MyArticleAddSubAction.java
.........
importorg.jbpm.JbpmConfiguration;
importorg.jbpm.JbpmContext;
importorg.jbpm.graph.def.ProcessDefinition;
importorg.jbpm.graph.exe.ProcessInstance;
importorg.jbpm.graph.exe.Token;
........
/**
*
*撰写文章操作Action类
*@struts.actionpath="/myarticleaddsub"scope="request"validate="false"
*/
publicclassMyArticleAddSubActionextendsAction{
privatestaticfinalLoglog=LogFactory.getLog(MyArticleAddSubAction.class);
/**
*文章服务接口实现对象
*/
privateArticleServicearticleService;
/**
*文章类型服务接口实现对象
*/
privateArticleTypeServicearticleTypeService;
/**
*JBPM服务接口实现对象
*/
privateJbpmConfigurationjbpmConfiguration;
/**
*Methodexecute
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@returnActionForward
*/
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
log.debug("MyArticleAction.execute()");
UserSessionuserSesssion=UserSession.getSession(request,response);
//得到文章信息
StringstypeNo=request.getParameter("typeNo");
inttypeNo=ConvertUtil.convertInt(stypeNo);
StringarticleName=request.getParameter("articleName");
Stringcontent=request.getParameter("content");
Articlearticle=newArticle();
article.setArticleName(articleName);
article.setContent(content);
article.setState(Article.EDITED);
article.setTypeNo(newInteger(typeNo));
article.setUserNo(newInteger(userSesssion.getUserNo()));
//得到相应的文章类型
ArticleTypearticleType=articleTypeService.getArticleType(article.getTypeNo().intValue());
//得到相应的流程定义,启动流程实例
JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();
ProcessDefinitionprocessDefinition=jbpmContext.getGraphSession().findLatestProcessDefinition(articleType.getPdName());
ProcessInstanceprocessInstance=newProcessInstance(processDefinition);
//让流程往下进行一步
Tokentoken=processInstance.getRootToken();
token.signal();
//保存流程实例与状态
jbpmContext.save(processInstance);
jbpmContext.save(token);
jbpmContext.close();
article.setPiId(processInstance.getId());
//增加文章
articleService.addArticle(article);
returnmapping.findForward("success");
}
/**
*得到文章服务接口实现对象
*@returnarticleService
*/
publicArticleServicegetArticleService(){
returnarticleService;
}
/**
*设置文章服务接口实现对象
*@paramarticleService要设置的articleService
*/
publicvoidsetArticleService(ArticleServicearticleService){
this.articleService=articleService;
}
/**
*得到文章类型服务接口实现对象
*@returnarticleTypeService
*/
publicArticleTypeServicegetArticleTypeService(){
returnarticleTypeService;
}
/**
*设置文章类型服务接口实现对象
*@paramarticleTypeService要设置的articleTypeService
*/
publicvoidsetArticleTypeService(ArticleTypeServicearticleTypeService){
this.articleTypeService=articleTypeService;
}
/**
*得到JBPM服务接口实现对象
*@returnjbpmConfiguration
*/
publicJbpmConfigurationgetJbpmConfiguration(){
returnjbpmConfiguration;
}
/**
*设置JBPM服务接口实现对象
*@paramjbpmConfiguration要设置的jbpmConfiguration
*/
publicvoidsetJbpmConfiguration(JbpmConfigurationjbpmConfiguration){
this.jbpmConfiguration=jbpmConfiguration;
}
}
执行该action后,则就创建了一个与之匹配的流程实例。
查看数据库中article表的变化。
可以发现
PiId记录了一个数字编号,同时jbpm_processinstance表中最大的一个id号与之匹配,这说明当保存文章时,系统后台创建了一个流程实例,该流程实例就是记录该文章的审批过程的JBPM实例。
(你可以运行一个文章的审批全过程来跟踪与之匹配的流程实例变化情况)。
下一步就是发布该文章了。
到你的文章列表中点击“发布”。
系统调用ACTION:
MyArticlePubAction.java继而转到MyArticlePubSubAction.java
.......
importorg.jbpm.JbpmConfiguration;
importorg.jbpm.JbpmContext;
importorg.jbpm.graph.def.Transition;
importorg.jbpm.graph.exe.ProcessInstance;
importorg.jbpm.graph.exe.Token;
.........
/**
*
*发布文章操作Action类
*@struts.actionpath="/myarticle"scope="request"validate="false"
*/
publicclassMyArticlePubActionextendsAction{
privatestaticfinalLoglog=LogFactory.getLog(MyArticlePubAction.class);
privateArticleServicearticleService;
privateArticleTypeServicearticleTypeService;
privateJbpmConfigurationjbpmConfiguration;
/**
*Methodexecute
*@parammapping
*@paramform
*@paramrequest
*@paramresponse
*@returnActionForward
*/
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
log.debug("MyArticleAction.execute()");
UserSessionuserSesssion=UserSession.getSession(request,response);
//得到文章信息
//得到文章号
StringsarticleNo=request.getParameter("articleNo");
intarticleNo=ConvertUtil.convertInt(sarticleNo);
Articlearticle=articleService.getArticle(articleNo);
request.setAttribute("article",article);
//判断是否是此用户文章
if(article.getUserNo()!
=null&&article.getUserNo().intValue()==userSesssion.getUserNo()){
//创建相应的流程实例
//得到相应的文章类型
ArticleTypearticleType=articleTypeService.getArticleType(article.getTypeNo().intValue());
request.setAttribute("articleType",articleType);
//得到相应的流程
JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();
ProcessInstanceprocessInstance=jbpmContext.getProcessInstance(article.getPiId());
log.error("instance:
"+processInstance.getId());
//得到当前的执行令牌
Tokentoken=processInstance.getRootToken();
//得到当前的可执行转换
//Settransitions=token.getNode().getArrivingTransitions();
Listtransitions=token.getNode().getLeavingTransitions();
Settransitionnames=newHashSet();
if(transitions!
=null){
for(inti=0;i Transitiontransition=(Transition)transitions.get(i);
System.err.println("transition.getName()"+transition.getName());
transitionnames.add(transition.getName());
}
}
request.setAttribute("transitionnames",transitionnames);
jbpmContext.close();
}
returnmapping.findForward("success");
}
publicArticleServicegetArticleService(){
returnarticleService;
}
publicvoidsetArticleService(ArticleServicearticleService){
this.articleService=articleService;
}
publicJbpmConfigurationgetJbpmConfiguration(){
returnjbpmConfiguration;
}
publicvoidsetJbpmConfiguration(JbpmConfigurationjbpmConfiguration){
this.jbpmConfiguration=jbpmConfiguration;
}
publicArticleTypeServicegetArticleTypeService(){
returnarticleTypeService;
}
publicvoidsetArticleTypeService(ArticleTypeServicearticleTypeService){
this.articleTypeService=articleTypeService;
}
}
ok,到这里,你仍然可以去查看数据库中article表的变化情况。
你会发现表中的Auditstate字段
由null变成了一级审批,这是为什么,因为该文章对应的流程的下一个节点就是一级审批。
然后我们以one(一级审批)用户登录,就可以看到需要一级审批用户审批的