Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Activiti¹¤×÷Á÷ÒýÇæÊ¹ÓÃ
 
×÷Õߣºxiangbq À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-12-31
  4791  次浏览      27
 

Activiti¹¤×÷Á÷ÒýÇæÊ¹ÓÃ

1.¼òµ¥½é¹¤×÷Á÷ÒýÇæÓëActiviti

1.1 ÎÒÓ빤×÷Á÷ÒýÇæ

ÔÚµÚÒ»¼Ò¹«Ë¾¹¤×÷µÄʱºòÖ÷ÒªÈÎÎñ¾ÍÊÇ¿ª·¢OAϵͳ£¬µ±È»»ù±¾¶¼ÊÇÓй¤×÷Á÷µÄÖ§³Ö£¬²»¹ýµ±Ê±Ê¹ÓõŤ×÷Á÷ÒýÇæÊǹ«Ë¾Ò»Ð©Å£ÈË¿ª·¢µÄ£¨¾Ý˵ÊÇÓÃÒ»¸ö¿ªÔ´µÄÒýÇæÐ޸ĵģ©£¬Ãû³Æ½ÐCoreFlow£»¹¦ÄÜÏà¶ÔActivitiÀ´Ëµ±È½ÏÈõ£¬µ«ÊÇÄÜÂú×ãÈÕ³£µÄʹÓ㬵±È»Ò²Óв»ÉÙµÄÎÊÌâËùÒÔºóÀ´ÎÒÃÇÖ»ÄÜÐÞ¸ÄÒýÇæµÄ´úÂë´ò²¹¶¡¡£

ÏÖÔÚÊÇÎÒ¹¤×÷µÄµÚ¶þ¼Ò¹«Ë¾£¬ÒòΪҪ¿ª·¢ERP¡¢OAµÈϵͳÐèҪʹÓù¤×÷Á÷£¬ÔÚÏîÄ¿µ÷Ñн׶ÎÎÒÏÈËÑË÷×ÊÁÏÑ¡ÔñʹÓÃÄĸö¿ªÔ´¹¤×÷Á÷ÒýÇæ£¬×îÖÕÈ·¶¨ÁËActiviti5²¢»ùÓÚ¹«Ë¾µÄ¼Ü¹¹×öÁËһЩDEMO¡£

1.2 ActivitiÓëJBPM5£¿

¶ÔÓÚActiviti¡¢jBPM4¡¢jBPM5ÎÒÃÇÓ¦¸ÃÈçºÎÑ¡Ôñ£¬ÔÚInfoQÉÏÓÐһƪÎÄÕÂдµÄºÜºÃ£¬´Ó´óµÄ²ãÃæ±È½Ï¸÷¸öÒýÇæÖ®¼äµÄ²îÒ죬Çë²Î¿¼ÎÄÕ£º×ݹÛjBPM£º´ÓjBPM3µ½jBPM5ÒÔ¼°Activiti5

1.3 Activiti×ÊÁÏ

¹ÙÍø£ºhttp://www.activiti.org/

ÏÂÔØ£ºhttp://www.activiti.org/download.html

°æ±¾£ºActivitiµÄ°æ±¾ÊÇ´Ó5¿ªÊ¼µÄ£¬ÒòΪActivitiÊÇʹÓÃjBPM4µÄÔ´Â룻°æ±¾·¢²¼£ºÁ½¸öÔ·¢²¼Ò»´Î¡£

Eclipse Plugin: http://activiti.org/designer/update/

ActivitÖÐÎÄȺ£º5435716

2.³õ´ÎʹÓÃÓöµ½ÎÊÌâÊÕ¼¯

ÒòΪActiviti¸Õ¸ÕÍ˳ö²»¾ÃËùÒÔ×ÊÁϱȽϿÕȱ£¬ÖÐÎÄ×ÊÁϸüÊÇÉٵĿÉÁ¯£¬ËùÒÔ¿ªÊ¼µÄʱºòһͷÎíË®£¨ËäȻ֮ǰÓùý¹¤×÷Á÷£¬µ«ÊǸоõ²î¾àºÜ¶à£©£¬¶øÇÒ¹Ù·½µÄÊֲỹ²»ÊǺÜÈ«Ãæ£»ËùÒÔÎÒ°ÑÎÒÔÚѧϰʹÓõĹý³ÌÓöµ½µÄһЩÒÉÎʶ¼ÂÞÁгöÀ´·ÖÏí¸ø´ó¼Ò£»ÒÔϼ¸µãÊÇÎÒÓöµ½ºÍÏëµ½µÄ£¬Èç¹ûÄ㻹ÓÐʲôÒÉÎÊ¿ÉÒÔÔÚÆÀÂÛÖкÍÎÒ½»Á÷ÔÙ²¹³ä¡£

2.1 ²¿ÊðÁ÷³ÌͼºóÖÐÎÄÂÒÂë

ÂÒÂëÊÇÒ»Ö±²øÈÆ×ŹúÈ˵ÄÎÊÌ⣬֮ǰ¸÷¸ö¼¼Êõ¡¢¹¤¾ß³öÏÖÂÒÂëµÄÎÊÌâд¹ýºÜ¶àÎÄÕ£¬ÕâÀïÒ²²»ÀýÍâ¡­¡­£¬ActivitiµÄÂÒÂëÎÊÌâÔÚÁ÷³ÌͼÖС£

Á÷³ÌͼµÄÂÒÂëÈçÏÂͼËùʾ£º

½â¾ö°ì·¨ÓÐÁ½ÖÖ£º

2.1.1 ÐÞ¸ÄÔ´´úÂ뷽ʽ

ÐÞ¸ÄÔ´Âë

org.activiti.engine.impl.bpmn.diagram.ProcessDiagramCanvas

ÔÚ¹¹Ôì·½·¨ÔÚ¹¹Ôì·½·¨

public ProcessDiagramCanvas(int width, int height)

ÖÐÓÐÒ»ÐдúÂëÊÇÉèÖÃ×ÖÌåµÄ£¬Ä¬ÈÏÊÇÓà Arial ×ÖÌ壬Õâ¾ÍÊÇÂÒÂë²úÉúµÄÔ­Òò£¬°Ñ×Ö¸ÄΪ±¾µØµÄÖÐÎÄ×ÖÌå¼´¿É£¬ÀýÈ磺

Font font = new Font("WenQuanYi Micro Hei", Font.BOLD, 11);

µ±È»Èç¹ûÄãÓÐÅäÖÃÎļþ¶ÁÈ¡¹¤¾ßÄÇô¿ÉÒÔÉèÖÃÔÚ*.propertiesÎļþÖУ¬ÎÒ¾ÍÊÇÕâô×öµÄ£º

Font font = new Font(PropertyFileUtil.get("activiti.diagram.canvas.font"), Font.BOLD, 11);

2.1.2 ʹÓÃѹËõ°ü·½Ê½²¿Êð

ActivitiÖ§³Ö²¿Êð*.bpmn20.xml¡¢bar¡¢zip¸ñʽµÄÁ÷³Ì¶¨Òå¡£

ʹÓÃActivit Deisigner¹¤¾ßÉè¼ÆÁ÷³ÌͼµÄʱºò»áÓÐÈý¸öÀàÐ͵ÄÎļþ:

1.activitiÉè¼Æ¹¤¾ßʹÓõÄÎļþ

2.bpmn20.xmlÉè¼Æ¹¤¾ß×Ô¶¯¸ù¾Ý.activitiÎļþÉú³ÉµÄxmlÎļþ

3.pngÁ÷³ÌͼͼƬ

½â¾ö°ì·¨¾ÍÊǰÑxmlÎļþºÍͼƬÎļþͬʱ²¿Êð£¬ÒòΪÔÚµ¥¶À²¿ÊðxmlÎļþµÄʱºòActiviti»á×Ô¶¯Éú³ÉÒ»ÕÅÁ÷³ÌͼµÄͼƬÎļþ£¬µ«ÊÇÕâÑùÔÚʹÓõÄʱºò×ø±êºÍͼƬ¶ÔÓ¦²»ÆðÀ´¡­¡­

ËùÒÔ°ÑxmlºÍͼƬͬʱ²¿ÊðµÄʱºòActiviti×Ô¶¯¹ØÁªxmlºÍͼƬ£¬µ±ÐèÒª»ñȡͼƬµÄʱºòÖ±½Ó·µ»Ø²¿ÊðʱѹËõ°üÀïÃæµÄͼƬÎļþ£¬¶ø²»ÊÇActiviti×Ô¶¯Éú³ÉµÄͼƬÎļþ

2.1.2.1 ʹÓù¤¾ß´ò°üBarÎļþ

ÓÒ¼üÏîÄ¿Ãû³ÆÈ»ºóµã»÷¡°Create deployment artifacts¡±£¬»áÔÚsrcĿ¼Öд´½¨deploymentÎļþ¼Ð£¬ÀïÃæ°üº¬*.barÎļþ.

2.1.2.2 ʹÓÃAnt½Å±¾´ò°üZipÎļþ

ÕâÒ²ÊÇÎÒÃDzÉÓõİ취£¬Äã¿ÉÒÔÊÖ¶¯Ñ¡ÔñxmlºÍpng´ò°ü³Ézip¸ñʽµÄÎļþ£¬Ò²¿ÉÒÔÏñÎÒÃÇÒ»Ñù²ÉÓÃant targetµÄ·½Ê½´ò°üÕâÁ½¸öÎļþ¡£

<?xml version="1.0" encoding="UTF-8"?>
<project name="foo">

<property name="workflow.definition" value="foo-common-core/src/main/resources/diagrams" />
<property name="workflow.deployments" value="foo-common-core/src/main/resources/deployments" />

<target name="workflow.package.oa.leave">
<echo>´ò°üÁ÷³Ì¶¨Òå¼°Á÷³Ìͼ::OA-Çë¼Ù</echo>
<zip destfile="${workflow.deployments}/oa/leave.zip" basedir="${workflow.definition}/oa/leave" update="true"
includes="*.xml,*.png" />
</target>
</project>

ÕâÑùµ±ÐÞ¸ÄÁ÷³Ì¶¨ÒåÎļþºóÖ»ÒªÔËÐÐantÃüÁî¾Í¿ÉÒÔ´ò°üÁË£º

ant workflow.package.oa.leave

ÏÖÔÚ²¿Êðbar»òÕßzipÎļþ²é¿´Á÷³ÌͼͼƬ¾Í²»ÊÇÂÒÂëÁË£¬¶øÊÇÄãµÄѹËõ°üÀïÃæµÄpngÎļþ¡£

2.2 ʹÓÃÒýÇæÌṩµÄForm»¹ÊÇ×Ô¶¨ÒåÒµÎñForm

2.2.1 ÒýÇæÌṩµÄForm

¶¨Òå±íµ¥µÄ·½Ê½ÔÚÿ¸öTask±êÇ©Öж¨ÒåextensionElementsºÍactiviti:formProperty¼´¿É£¬µ½´ïÕâ¸ö½ÚµãµÄʱºò¿ÉÒÔͨ¹ýAPI¶ÁÈ¡±íµ¥ÔªËØ¡£

Activiti¹Ù·½µÄÀý×ÓʹÓõľÍÊÇÔÚÁ÷³Ì¶¨ÒåÖÐÉèÖÃÿһ¸ö½ÚµãÏÔʾʲôÑùµÄ±íµ¥ÄÄЩ×Ö¶ÎÐèÒªÏÔʾ¡¢ÄÄЩ×Ö¶ÎÖ»¶Á¡¢ÄÄЩ×ֶαØÌî¡£

µ«ÊÇÕâÖÖ·½Ê½½ö½öÊÊÓÃÓڱȽϼòµ¥µÄÁ÷³Ì£¬¶ÔÓÚÉÔ΢¸´ÔÓ»òÕßÒ³ÃæÐèÒªÒµÎñÂß¼­µÄÅжϵÄÇé¿ö¾Í²»ÊÊÓÃÁË¡£

¶ÔÓÚÊý¾ÝµÄ±£´æ¶¼ÊÇÔÚÒýÇæµÄ±íÖУ¬²»ÀûÓÚºÍÆäËû±íµÄ¹ØÁª¡¢¶ÔÕû¸öϵͳµÄ¹æ»®Ò²²»Àû£¡

2.2.2 ×Ô¶¨ÒåÒµÎñForm

ÕâÖÖ·½Ê½Ó¦¸ÃÊÇ´ó¼ÒÓõÄ×î¶àµÄÁË£¬ÒòΪһ°ãµÄÒµÎñϵͳҵÎñÂß¼­¶¼»á±È½Ï¸´ÔÓ£¬¶øÇÒÊý¾Ý¿âÖкܶà±í¶¼»áÓÐÒÀÀµ¹ØÏµ£¬±íµ¥ÖÐÓкܶà״̬Åжϡ£

ÀýÈçÎÒÃǵÄϵͳÊÊÓÃjQuery UI×÷ΪUI£¬Óкܶàjavascript´úÂë£¬Ò³ÃæµÄºÜ¶à²Ù×÷ÐèÒªÌØÊâ´¦Àí£¨ÀýÈ磺¶à¸öÑ¡ÏîµÄ»¥³â¡¢Ã¿¸ö½Úµã¸ù¾ÝÀàÐͺͲÙ×÷ÈËÏÔʾ²»Í¬µÄ°´Å¥£©£»»ù±¾Ã¿¸ö¹«Ë¾¶¼ÓÐÒ»Ì××Ô¼ºµÄUI·ç¸ñ£¬Òª±£³Ö¶à¸öϵͳµÄ²Ù×÷ϰ¹ßÒ»ÖÂÖ»ÄÜʹÓÃ×Ô¶¨Òå±íµ¥²ÅÄÜÂú×ã¡£

2.3 ÒµÎñºÍÁ÷³ÌµÄ¹ØÁª·½Ê½

Õâ¸öÎÊÌâÔÚȺÀïÃæºÜ¶àÈ˶¼Îʹý£¬ÕâÒ²ÊÇÎÒ¸Õ¸Õ¿ªÊ¼ÃÔ»óµÄµØ·½£»

ºóÀ´¿´ÁËÒÔÏÂAPI·¢ÏÖRuntimeServiceÓÐÁ½¸ö·½·¨£º

2.3.1 startProcessInstanceByKey

javadoc¶ÔÆä˵Ã÷£º

startProcessInstanceByKey(String processDefinitionKey, Map variabes)
Starts a new process instance in the latest version of the process definition with the given key

ÆäÖÐbusinessKey¾ÍÊÇÒµÎñID£¬ÀýÈçÒªÉêÇëÇë¼Ù£¬ÄÇôÏÈÌîдµÇ¼ÇÐÅÏ¢£¬È»ºó£¨±£´æ+Æô¶¯Á÷³Ì£©£¬ÒòΪÇë¼ÙÊǵ¥¶ÀÉè¼ÆµÄÊý¾Ý±í£¬ËùÒÔ±£´æºóµÃµ½ÊµÌåID¾Í¿ÉÒÔ°ÑËü´«¸øprocessInstanceBusinessKey·½·¨Æô¶¯Á÷³Ì¡£µ±ÐèÒª¸ù¾ÝbusinessKey²éѯÁ÷³ÌµÄʱºò¾Í¿ÉÒÔͨ¹ýAPI²éѯ:

runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey, processDefinitionKey);

½¨ÒéÊý¾Ý¿âÈßÓàÉè¼Æ£ºÔÚÒµÎñ±íÉè¼ÆµÄʱºòÌí¼ÓÒ»ÁУºPROCESS_INSTANCE_ID varchar2(64)£¬ÔÚÁ÷³ÌÆô¶¯Ö®ºó°ÑÁ÷³ÌID¸üе½ÒµÎñ±íÖУ¬ÕâÑù²»¹Ü´ÓÒµÎñ»¹ÊÇÁ÷³Ì¶¼¿ÉÒÔ²éѯµ½¶Ô·½£¡

ÌØ±ð˵Ã÷£º ´Ë·½·¨Æô¶¯Ê±×Ô¶¯Ñ¡Ôñ×îа汾µÄÁ÷³Ì¶¨Òå¡£

2.3.2 startProcessInstanceById

javadoc¶ÔÆä˵Ã÷£º

startProcessInstanceById(String processDefinitionId, String businessKey, Map variables)
Starts a new process instance in the exactly specified version of the process definition with the given id.

processDefinitionId£ºÕâ¸ö²ÎÊýµÄÖµ¿ÉÒÔͨ¹ýrepositoryService.createProcessDefinitionQuery()·½·¨²éѯ£¬¶ÔÓ¦Êý¾Ý¿â£ºACT_RE_PROCDEF£»Ã¿´Î²¿ÊðÒ»´ÎÁ÷³Ì¶¨Òå¾Í»áÌí¼ÓÒ»ÌõÊý¾Ý£¬Í¬ÃûµÄ°æ±¾ºÅÀÛ¼Ó¡£

ÌØ±ð˵Ã÷£º ´Ë¿ÉÒÔÖ¸¶¨²»Í¬°æ±¾µÄÁ÷³Ì¶¨Ò壬ÈÃÓû§¶àÒ»²ãÑ¡Ôñ¡£

2.3.3 ÈçºÎÑ¡Ôñ

½¨ÒéʹÓÃstartProcessInstanceByKey£¬ÌØÊâÇé¿öÐèҪʹÓÃÒÔÍùµÄ°æ±¾Ñ¡ÔñʹÓÃstartProcessInstanceById¡£

2.4 ͬ²½Óû§Êý¾Ý

Õâ¸öÎÊÌâÒ²ÊDZȽ϶àµÄÈËѯÎʹý£¬ActivitiÖ§³Ö¶ÔÈÎÎñ·ÖÅäµ½£ºÖ¸¶¨ÈË¡¢Ö¸¶¨×é¡¢Á½Õß×éºÏ£¬¶øÕâЩÈ˺Í×éµÄÐÅÏ¢¶¼±£´æÔÚACT_ID..±íÖУ¬ÓÐ×Ô¼ºµÄÓû§ºÍ×é(½ÇÉ«)¹ÜÀíÈúܶàÈ˲»ÖªËù´ëÁË£»Ô­ÒòÊÇÒòΪÿ¸öϵͳ¶¼»á´æÔÚÒ»¸öȨÏÞ¹ÜÀíÄ£¿é£¨Î¬»¤£ºÓû§¡¢²¿ÃÅ¡¢½ÇÉ«¡¢ÊÚȨ£©£¬²»ÖªµÀ¸ÃÔõôºÍActivitiͬ²½¡£

2.4.1 ½¨Òé´¦Àí·½Ê½

ActivitiÓÐÒ»¸öIdentityService½Ó¿Ú£¬Í¨¹ýÕâ¸ö½Ó¿Ú¿ÉÒÔ²Ù¿ØActivitiµÄACT_ID_*±íµÄÊý¾Ý£¬Ò»°ãµÄ×ö·¨ÊÇÓÃÒµÎñϵͳµÄȨÏÞ¹ÜÀíÄ£¿éά»¤Óû§Êý¾Ý£¬µ±½øÐÐCRUD²Ù×÷µÄʱºòÔÚÔ­ÓÐÒµÎñÂß¼­ºóÃæÌí¼Óͬ²½µ½ActivitiµÄ´úÂ룻ÀýÈçÌí¼ÓÒ»¸öÓû§Ê±Í¬²½Activiti UserµÄ´úÂëÆ¬¶Î£º

/**
* ±£´æÓû§ÐÅÏ¢ ²¢ÇÒͬ²½Óû§ÐÅÏ¢µ½activitiµÄidentity.User£¬Í¬Ê±ÉèÖýÇÉ«
* @param user
* @param roleIds
*/
public void saveUser(User user, List<Long> roleIds, boolean synToActiviti) {
accountManager.saveEntity(user);
String userId = user.getId().toString();

if (synToActiviti) {
List<org.activiti.engine.identity.User> activitiUsers = identityService.createUserQuery().userId(userId).list();
if (activitiUsers.size() == 1) {
//¸üÐÂÐÅÏ¢
org.activiti.engine.identity.User activitiUser = activitiUsers.get(0);
activitiUser.setFirstName(user.getName());
activitiUser.setLastName("");
activitiUser.setPassword(user.getPassword());
activitiUser.setEmail(user.getEmail());
identityService.saveUser(activitiUser);

// ɾ³ýÓû§µÄmembership
List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();
for (Group group : activitiGroups) {
identityService.deleteMembership(userId, group.getId());
}

// Ìí¼Ómembership
for (Long roleId : roleIds) {
Role role = roleManager.getEntity(roleId);
identityService.createMembership(userId, role.getEnName());
}

} else {
org.activiti.engine.identity.User newUser = identityService.newUser(userId);
newUser.setFirstName(user.getName());
newUser.setLastName("");
newUser.setPassword(user.getPassword());
newUser.setEmail(user.getEmail());
identityService.saveUser(newUser);

// Ìí¼Ómembership
for (Long roleId : roleIds) {
Role role = roleManager.getEntity(roleId);
identityService.createMembership(userId, role.getEnName());
}
}
}

}

ɾ³ý²Ù×÷Ò²ºÍÕâ¸öÀàËÆ£¡

²»¹Ü´ÓÒµÎñϵͳά»¤Óû§»¹ÊÇ´ÓActivitiά»¤£¬¿Ï¶¨ÒªÈ·¶¨Ò»·½£¬È»ºóCRUDµÄʱºòͬ²½µ½¶Ô·½£¬Èç¹ûÐèҪͬ²½¶à¸ö×ÓϵͳÄÇô¿ÉÒÔÔÙµ÷ÓÃWebServiceʵÏÖ¡£

2.5 Á÷³ÌͼÉè¼Æ¹¤¾ßÓÃʲô

ActivitiÌṩÁËÁ½¸öÁ÷³ÌÉè¼Æ¹¤¾ß£¬µ«ÊÇÃæÏò¶ÔÏó²»Í¬¡£

Activiti Modeler£¬ÃæÏòÒµÎñÈËÔ±£¬Ê¹ÓÿªÔ´µÄBPMNÉè¼Æ¹¤¾ßSignavio£¬Ê¹ÓÃBPMNÃèÊöÒµÎñÁ÷³Ìͼ

Eclipse Designer£¬ÃæÏò¿ª·¢ÈËÔ±£¬EclipseµÄ²å¼þ£¬¿ÉÒÔÈÿª·¢ÈËÔ±¶¨ÖÆÃ¿¸ö½ÚµãµÄÊôÐÔ£¨ID¡¢Name¡¢Listener¡¢AttrµÈ£©

2.5.1 ÎÒÃǵķ½Ê½

¿ÉÄÜÄã»á¾ªÑÈ£¬ÒòΪÎÒÃÇûÓÐʹÓÃActiviti Modeler£¬ÎÒÃÇÈÏΪÓÃVisoÒѾ­Äܱí´ïÁ÷³ÌͼµÄÒâ˼ÁË£¬¶øÇÒÏîÄ¿¾­ÀíÒ²ÊǼ¼Êõ³öÉí£¬ºÍ¿ª·¢ÈËÔ±Ò²ÈÝÒ×¹µÍ¨¡£

ĿǰÕâ¸öÏîÄ¿ÊǵÚÒ»¸öʹÓÃActivitiµÄ£¬¿ªÊ¼ÎÒÃÇÔÚÐèÇóµ÷Ñн׶ÎʹÓÃVisoÉè¼ÆÁ÷³Ìͼ£¬ÀûÓÃÓ¾µÀÁ÷³ÌͼÉè¼ÆºÍ¿Í»§¹µÍ¨£¬È·¶¨ºóÓɸºÔðÁ÷³ÌµÄ¿ª·¢ÈËÔ±ÓÃEclipse DesignerÉè¼ÆµÃµ½bpmn20.xml£¬×îºó²¿Êð¡£

2.6 Eclipse Designer´æÔÚµÄÎÊÌâ

Õâ¸ö²å¼þÓÐÒ»¸öºÜÌÖÑáµÄBugһֱδÐÞ¸´£¬°²×°Á˲å¼þºóEclipseµÄ¸´ÖƺÍÕ³Ìû¿ì½Ý¼ü»á±»¸ü»»Îª(Ctrl+Insert¡¢Shift+Insert)£»BugÃèÊöÇë¼û£º

1.Activit ForumsÖб¨¸æµÄBug

2.JiraµÄµÇ¼Ç

ËùÒÔ×îºóÎÒÃÇÖ»Äܵ¥¶À¿ªÒ»¸ö°²×°ÁËEclipse DesignerµÄEclipseרÃÅÓÃÀ´Éè¼ÆÁ÷³Ìͼ£¬ÕâÑù¾Í²»Ó°ÏìÕý³£Ê¹ÓÃEclipse JAVAEEÁË¡£

3.ÅäÖÃ

3.1 ¼¯³ÉSpring

¶ÔÓÚºÍSpringµÄ¼¯³ÉActiviti×öµÄ²»´í£¬¼òµ¥ÅäÖÃһЩBean´úÀí¼´¿ÉʵÏÖ£¬µ«ÊÇÓÐÁ½¸öºÍÊÂÎñÏà¹ØµÄµØ·½ÒªÌáʾ£º

ÅäÖÃprocessEngineConfigurationµÄʱºòÊôÐÔtransactionManagerҪʹÓúÍÒµÎñ¹¦ÄܵÄͬһ¸öÊÂÎñ¹ÜÀíBean£¬·ñÔòÊÂÎñ²»Í¬²½¡£

¶ÔÓÚʵÏÖÁËorg.activiti.engine.delegate°üÖеĽӿڵÄÀàÐèÒª±»ÊÂÎñ¿ØÖƵÄʵÏÖÀàÐèÒª±»Spring´úÀí£¬²¢ÇÒÌí¼ÓÊÂÎñµÄAnnotation»òÕßÔÚxmlÖÐÅäÖã¬ÀýÈç:

/**
* ´´½¨½É·ÑÁ÷³ÌµÄʱºò×Ô¶¯´´½¨ÊµÌå
*
* @author HenryYan
*/
@Service
@Transactional
publicclass CreatePaymentProcessListener implementsExecutionListener {
....
}

4.ʹÓõ¥Ôª²âÊÔ

µ¥Ôª²âÊÔ¾ùʹÓÃSpringµÄAbstractTransactionalJUnit4SpringContextTests×÷ΪSuperClass£¬²¢ÇÒÔÚ²âÊÔÀàÌí¼Ó£º

@ContextConfiguration(locations = { "/applicationContext-test.xml"})
@RunWith(SpringJUnit4ClassRunner.class)

ËäÈ»ActivitiÒ²ÌṩÁ˲âÊÔµÄһЩ³¬À࣬µ«ÊǸоõ²»ºÃÓã¬ËùÒÔ×Ô¼º·â×°ÁËһЩ·½·¨¡£

´úÂëÇë×ªÒÆ£ºhttps://gist.github.com/2182847

4.1 ÑéÖ¤Á÷³ÌͼÉè¼ÆÊÇ·ñÕýÈ·

´úÂëÇë×ªÒÆ£ºhttps://gist.github.com/2182869

4.2 ÒµÎñ¶ÔÏóºÍÁ÷³Ì¹ØÁª²âÊÔ

´úÂëÇë×ªÒÆ£ºhttps://gist.github.com/2182973

5.¸÷ÖÖ״̬µÄÈÎÎñ²éѯÒÔ¼°ºÍÒµÎñ¶ÔÏó¹ØÁª

ÎÒÃÇĿǰ·ÖΪ4ÖÐ״̬£ºÎ´Ç©ÊÕ¡¢°ìÀíÖС¢ÔËÐÐÖС¢ÒÑÍê³É¡£

²éѯµ½ÈÎÎñ»òÕßÁ÷³ÌʵÀýºóÒªÏÔʾÔÚÒ³Ãæ£¬Õâ¸öʱºòÐèÒªÌí¼ÓÒµÎñÊý¾Ý£¬×îÖÕ½á¹û¾ÍÊÇÒµÎñºÍÁ÷³ÌµÄ²¢¼¯£¬Çë²Î¿¼6.2¡£

5.1 δǩÊÕ(Task)

´ËÀàÈÎÎñÕë¶ÔÓÚ°ÑTask·ÖÅä¸øÒ»¸ö½Çɫʱ£¬ÀýÈ粿ÃÅÁìµ¼£¬ÒòΪ²¿ÃÅÁìµ¼½ÇÉ«¿ÉÒÔÖ¸¶¨¶à¸öÈËËùÒÔÐèÒªÏÈÇ©ÊÕÔÙ°ìÀí£¬ÊõÓÇÀռʽ

¶ÔÓ¦µÄAPI²éѯ£º

/**
* »ñȡδǩÊÕµÄÈÎÎñ²éѯ¶ÔÏó
* @param userId Óû§ID
*/
@Transactional(readOnly = true)
publicTaskQuery createUnsignedTaskQuery(String userId) {
TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
.taskCandidateUser(userId);
returntaskCandidateUserQuery;
}

5.2 °ìÀíÖÐ(Task)

´ËÀàÈÎÎñÊý¾ÝÀàÔ´ÓÐÁ½ÖÖ:

Ç©ÊÕºóµÄ£¬5.1ÖÐÇ©ÊÕºó¾ÍÓ¦¸ÃΪ°ìÀíÖÐ״̬

½ÚµãÖ¸¶¨µÄÊǾßÌåµ½Ò»¸öÈË£¬¶ø²»ÊǽÇÉ«

¶ÔÓ¦µÄAPI²éѯ£º

/**
* »ñÈ¡ÕýÔÚ´¦ÀíµÄÈÎÎñ²éѯ¶ÔÏó
* @param userId Óû§ID
*/
@Transactional(readOnly = true)
publicTaskQuery createTodoTaskQuery(String userId) {
TaskQuery taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
returntaskAssigneeQuery;
}

5.3 ÔËÐÐÖÐ(ProcessInstance)

˵°×Á˾ÍÊÇûÓнáÊøµÄÁ÷³Ì£¬ËùÓвÎÓë¹ýµÄÈ˶¼Ó¦¸Ã¿ÉÒÔ¿´µ½Õâ¸öʵÀý£¬µ«ÊÇActivitiµÄAPIûÓпÉÒÔͨ¹ýÓû§²éѯµÄ·½·¨£¬Õâ¸öÖ»ÄÜ×Ô¼ºÓÃhackµÄ·½Ê½´¦ÀíÁË£¬ÎÒĿǰ»¹Ã»Óд¦Àí¡£

´Ó±íACT_RU_EXECUTIONÖвéѯÊý¾Ý¡£

¶ÔÓ¦µÄAPI²éѯ£º

/**
* »ñȡδ¾­Íê³ÉµÄÁ÷³ÌʵÀý²éѯ¶ÔÏó
* @param userId Óû§ID
*/
@Transactional(readOnly = true)
publicProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) {
ProcessInstanceQuery unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey())
.active();
returnunfinishedQuery;
}

5.4 ÒÑÍê³É(HistoricProcessInstance)

ÒѾ­½áÊøµÄÁ÷³ÌʵÀý¡£

´Ó±íACT_HI_PROCINSTÖвéѯÊý¾Ý¡£

/**
* »ñÈ¡ÒѾ­Íê³ÉµÄÁ÷³ÌʵÀý²éѯ¶ÔÏó
* @param userId Óû§ID
*/
@Transactional(readOnly = true)
publicHistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) {
HistoricProcessInstanceQuery finishedQuery = historyService.createHistoricProcessInstanceQuery()
.processDefinitionKey(getProcessDefKey()).finished();
returnfinishedQuery;
}

5.5 ²éѯʱºÍÒµÎñ¹ØÁª

Ìáʾ£ºÖ®Ç°ÔÚÒµÎñ¶ÔÏóÌí¼ÓÁËPROCESS_INSTANCE_ID×Ö¶Î

˼·£ºÏÖÔÚ¿ÉÒÔÀûÓÃÕâ¸ö×ֶβéѯÁË£¬²»¹ÜÊÇTask»¹ÊÇProcessInstance¶¼¿ÉÒԵõ½Á÷³ÌʵÀýID£¬¿ÉÒÔ¸ù¾ÝÁ÷³ÌʵÀýID²éѯʵÌåÈ»ºó°ÑÁ÷³Ì¶ÔÏóÉèÖõ½ÊµÌåµÄÒ»¸öÊôÐÔÖÐÓÉAction»òÕßControllerÊä³öµ½Ç°Ì¨¡£

6.UI¼°½ØÍ¼

½áºÏʵ¼ÊÒµÎñÃèÊöÒ»¸öÒµÎñ´Ó¿ªÊ¼µ½½áÊøµÄ¹ý³Ì£¬¶ÔÓÚÃÔ»óµÄͬѧ¿´Íê»íÈ»¿ªÀÊÁË£»ÕâÀïʹÓÃÇë¼Ù×÷ΪÀý×Ó¡£

6.1 µ¥¶ÀÒ»¸öÁÐ±í¸ºÔðÉêÇë

ÕâÑùµÄºÃ´¦ÊÇÉêÇëºÍÁ÷³Ì°ìÀí·ÖÀ뿪´¦Àí£¬ÁбíÏÔʾδÆô¶¯Á÷³ÌµÄÇë¼Ù¼Ç¼£¨Êý¾Ý¿âPROCESS_INSTANCE_IDΪ¿Õ£©¡£

ÉêÇë½çÃæµÄ½ØÍ¼£º

6.2 Á÷³Ì״̬

6.3 Á÷³Ì¸ú×Ù

ͼƬ·½Ê½ÏÔʾµ±Ç°½Úµã£º

ÁбíÐÎʽÏÔʾÁ÷³ÌÁ÷ת¹ý³Ì:

6.3.1 µ±Ç°½Úµã¶¨Î»JS

Java´úÂëÇëÒÆ²½£ºhttps://gist.github.com/2183712

Javascript˼·£ºÏÈͨ¹ýAjax»ñÈ¡µ±Ç°½ÚµãµÄ×ø±ê£¬ÔÚÖ¸¶¨Î»ÖÃÌí¼ÓºìÉ«±ß¿ò£¬È»ºó¼ÓÔØÍ¼Æ¬¡£

´úÂëÒÆ²½£ºhttps://gist.github.com/2183804

7.¿ªÆôLogger

Ìí¼Ólog4jµÄjar

ÉèÖÃlog4j.logger.java.sql=DEBUG

8.½áÊø

֮ǰ¾ÍÏëдÕâÆªÎÄÕ£¬ÏÖÔÚÖÕÓÚÍê³ÉÁË£¬»¨·ÑÁ˼¸¸öСʱ£¬Ï£ÍûÄܽÚÊ¡Ä㼸ÌìµÄʱ¼ä¡£

   
4791 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

¶àά·½·¨À´¿ª·¢ÓлúµÄÒµÎñÁ÷³Ì¼Ü¹¹
SCA Ó¦ÓóÌÐò¿ª·¢
BPM ºÍ SOA ÐÔÄÜ×î¼Ñʵ¼ù
ʵÏÖÆóÒµ·þÎñ×ÜÏßģʽ
Ïà¹ØÎĵµ

SCA½éÉܼ°Ó¦ÓÃʵÀý
»ùÓÚSOA¼Ü¹¹µÄESBƽ̨£ºInfomagic
SCA¼Ü¹¹
SOAµÄ»ù±¾¸ÅÄî
Ïà¹Ø¿Î³Ì

ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

»ùÓÚSOAµÄ¹¤×÷Á÷£¨WF£©ÕûºÏ
SOA 100ÎÊ - ÎÊÓë´ð
SOAP Ó¦ÓÃģʽ:´¦ÀíÓëÐÔÄÜ
ESB¼Ü¹¹Ö®Æóҵʵʩ°¸Àý
»ùÓÚSOA¼Ü¹¹µÄÆóÒµ¼¯³Éϵͳ
»ùÓÚSOAµÄÌåϵ¼Ü¹¹Éè¼Æ


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


ijµÚÈý·½µç×ÓÖ§¸¶ÆóÒµ SOA¼Ü¹¹Éè¼Æ
ijµç×ÓÆóÒµ SOAÓ¦ÓÃ
ÖйúÒÆ¶¯ SOAÅàѵ
±±¾©´óѧ SOA¼Ü¹¹Éè¼ÆÊµ¼ù
ÓѰÏÕ SOA¼Ü¹¹Éè¼Æ
ÉϺ£ SOA¼Ü¹¹Êµ¼ù
ɽ¶«Òƶ¯Í¨ÐÅ SOAÌåϵ½á¹¹Êµ¼ù