在實際的BPM集成開發過程中,Liferay和Activiti這兩個異構的系統之間,用戶、組的同步需求非常重要,用來實現簽收組的概念,比如指定簽收組、會簽、搶簽都需要用到。
Activiti可以通過自定義實現SessionFactory,實現customUserManager和customRoleManager的方式集成第三方的用戶關系。
這里我介紹一個方法,可以借助Liferay的實體監聽器來做用戶、組、用戶-組成員關系的三種同步。
其實實現原理非常簡單
用戶組的同步,就是實現 BaseModelListener 泛型接口
package com.lifiti.hooks; import org.osgi.service.component.annotations.Component; import com.liferay.portal.kernel.exception.ModelListenerException; import com.liferay.portal.kernel.model.BaseModelListener; import com.liferay.portal.kernel.model.ModelListener; import com.liferay.portal.kernel.model.UserGroup; import com.lifiti.util.IdentifyHelper; @Component(immediate = true, service = ModelListener.class) public class UserGroupListener extends BaseModelListener<UserGroup>{ @Override public void onAfterCreate(UserGroup ug) throws ModelListenerException{ System.out.println(ug.getUuid()+ug.getName() + " Added."); IdentifyHelper.saveGroup(ug.getUuid(), ug.getName(), 1); } @Override public void onAfterRemove(UserGroup ug) throws ModelListenerException { System.out.println(ug.getName() + " Deleted."); IdentifyHelper.delGroup(ug.getUuid()); } @Override public void onAfterUpdate(UserGroup ug) throws ModelListenerException { System.out.println(ug.getName() + " Modified."); IdentifyHelper.delGroup(ug.getUuid()); IdentifyHelper.saveGroup(ug.getUuid(), ug.getName(), 1); } }
用戶,成員關系的同步
其中onAfterAddAssociation 就是監聽成員關系,可以在liferay的users_usergroups表和activiti的act_id_membership查看
實際上就是一個關聯中間表
package com.lifiti.hooks; import org.osgi.service.component.annotations.Component; import com.liferay.portal.kernel.exception.ModelListenerException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.BaseModelListener; import com.liferay.portal.kernel.model.ModelListener; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.lifiti.util.IdentifyHelper; @Component(immediate = true, service = ModelListener.class) public class UserListener extends BaseModelListener<User> { @Override public void onAfterCreate(User u) throws ModelListenerException { System.out.println(u.getScreenName() + " Added."); IdentifyHelper.saveUser(u.getScreenName(), u.getLastName() + u.getFirstName(), u.getEmailAddress()); } @Override public void onAfterRemove(User u) throws ModelListenerException { System.out.println(u.getUserId() + " Deleted."); IdentifyHelper.delUser(u.getScreenName()); } @Override public void onAfterUpdate(User u) throws ModelListenerException { System.out.println(u.getUserId() + " Modified."); IdentifyHelper.delUser(u.getScreenName()); IdentifyHelper.saveUser(u.getScreenName(), u.getLastName() + u.getFirstName(), u.getEmailAddress()); } @Override public void onAfterAddAssociation(Object classPK, String associationClassName, Object associationClassPK) throws ModelListenerException { try { //對關系類型進行過濾,比如com.liferay.portal.kernel.model.UserRole先不處理 if ("com.liferay.portal.kernel.model.UserGroup".equals(associationClassName)) { IdentifyHelper.createMembership( UserLocalServiceUtil.getUser(Long.parseLong(classPK.toString())).getScreenName(), UserGroupLocalServiceUtil.getUserGroup(Long.parseLong(associationClassPK.toString())) .getUuid()); System.out.println(classPK.toString() + "#" + associationClassName + "#" + associationClassPK.toString() + " associationClassName Modified."); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (PortalException e) { e.printStackTrace(); } } @Override public void onAfterRemoveAssociation(Object classPK, String associationClassName, Object associationClassPK) throws ModelListenerException { try { if ("com.liferay.portal.kernel.model.UserGroup".equals(associationClassName)) { IdentifyHelper.deleteMembership( UserLocalServiceUtil.getUser(Long.parseLong(classPK.toString())).getScreenName(), UserGroupLocalServiceUtil.getUserGroup(Long.parseLong(associationClassPK.toString())) .getUuid()); System.out.println(classPK.toString() + "#" + associationClassName + "#" + associationClassPK.toString() + " associationClassName Removed."); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (PortalException e) { e.printStackTrace(); } } }
運行情況:
1、用戶同步,在liferay的用戶管理后台添加用戶:
添加后,activiti也有同名的用戶了(自動同步),即使修改或刪除也能同步:
2、用戶組同步
注意,liferay叫用戶群組,acitiviti叫組
liferay添加組以后,activiti也自動同步:
3、成員關系同步
同步后,發現activiti也有同樣的 “用戶-組” 關系了
Activiti的集成開發系列文章集合在這里:
http://www.cnblogs.com/starcrm/p/6047486.html
全部工程源代碼下載: