суббота, 7 ноября 2015 г.

Пользовательские задачи Oracle BPM 12c: Custom Escalation Java Function

Custom Escalation Java Function указывается в конфигурации задачи для указания по какой логике будет выполняться эскалация для пользователей и групп (для ролей не используется!).

Custom Escalation Java Function рассмотрим на примере:
 package oracle.bpel.services.workflow.assignment.dynamic;  
   
 import java.util.List;  
 import java.util.Map;  
   
 import oracle.bpel.services.workflow.task.model.Task;  
 import oracle.bpel.services.workflow.assignment.dynamic.DynamicAssignmentException;  
   
 import oracle.tip.pc.services.common.ServiceFactory;  
 import oracle.tip.pc.services.identity.BPMAuthorizationService;  
   
 import oracle.tip.pc.services.identity.BPMAppRole;  
 import oracle.tip.pc.services.identity.BPMAuthorizationService;  
 import oracle.tip.pc.services.identity.BPMGroup;  
 import oracle.tip.pc.services.identity.BPMIdentityService;  
 import oracle.tip.pc.services.identity.BPMUser;  
 /*  
  * Обеспечивает эскалацию на владельца задачи.  
  */  
 public class OwnerEscalation implements IDynamicTaskEscalationFunction {  
   public String defaultUser;  
   
   @Override  
   public String getTaskEscalationUser(Task task) throws DynamicAssignmentException {  
     String ownerRole = task.getOwnerRole();  
     String ownerGroup = task.getOwnerGroup();  
     String ownerUser = task.getOwnerUser();  
     if (ownerRole != null) {  
       try {  
         BPMAuthorizationService idenService = ServiceFactory.getIdentityServiceInstance();  
         List<BPMUser> usersInRole =  
           idenService.getParticipantsToAppRole(ownerRole, task.getApplicationContext(), false);  
         if (usersInRole.size() > 0) {  
           // Берём первого пользователя  
           return usersInRole.get(0).getName();  
         }  
       } catch (Exception ex) {  
         ex.printStackTrace();  
       }  
     } else if (ownerGroup != null) {  
       try {  
         BPMAuthorizationService idenService = ServiceFactory.getIdentityServiceInstance();  
         List<BPMUser> usersInGroup = idenService.getParticipantsToGroup(ownerGroup, true);  
         if (usersInGroup.size() > 0) {  
           // Берём первого пользователя  
           return usersInGroup.get(0).getName();  
         }  
       } catch (Exception ex) {  
         ex.printStackTrace();  
       }  
     } else if (ownerUser != null) {  
       return ownerUser;  
     }  
     return defaultUser;  
   }  
   
   @Override  
   public String getTaskEscalationUser(String string) throws DynamicAssignmentException {  
     return defaultUser;  
   }  
   
   @Override  
   public void setInitParams(Map map) throws DynamicAssignmentException {  
     // Добавляем параметр указывающий на какого пользователя проводить эскалацию,   
     // если владелец задачи (Owner) не указан  
     defaultUser=(String)map.get("DEFAULT_USER");  
   }  
   
   @Override  
   public String getFunctionName() {  
     return "OWNER_ESCALATION";  
   }  
   
   @Override  
   public String getDescription() {  
     return "Escalation to task owner";  
   }  
 }  
   
Логика данного примера:
Если у задачи определён владелец (Owner), то эскалация будет выполняться на владельца. Иначе, на пользователя указанного в конфигурации как DEFAULT_USER

Важно:

  • Класс должен быть в пакете oracle.bpel.services.workflow.assignment.dynamic.

Установка:

  1. Собрать JAR содержащий класс и положить его в директорию $MW_HOME\soa\soa\modules\oracle.soa.ext_11.1.1
  2. Запустить ant в директории $MW_HOME\soa\soa\modules\oracle.soa.ext_11.1.1 (вероятно потребуется проинициализировать переменные окружения)
  3. Перезагрузить soa-сервер для того, чтобы новый класс был доступен серверу (был в classpath).
  4. Зарегистрировать Task Escalation Function:
    1. Войти в EM (Enterprise Manager Fusion Middleware Control)
    2. Перейти в soa-infra -> SOA Administration -> Workflow Properties
    3. Перейти на закладку Task и добавить наш класс (Add function) следующим образом:
Альтернативный вариант: вместо указанных действий в п.1-2 можно положить скомпилированный класс в директорию $MW_HOME\soa\soa\modules\oracle.soa.ext_11.1.1\classes


Комментариев нет:

Отправить комментарий