Рубрики
Без рубрики

Руководство по активити с Java

Изучите основы использования Activiti с Java.

Автор оригинала: baeldung.

1. Обзор

Activiti API — это система управления рабочим процессом и бизнес-процессами. Мы можем определить процесс в нем, выполнить его и манипулировать им по-разному, используя услуги, предоставляемые API. Для этого требуется JDK 7 “.

Разработка с использованием API может быть выполнена в любом IDE, но для использования Активисты Дизайнер , нам нужно затмение.

Мы можем определить процесс в нем с помощью стандарта BPMN 2.0. Существует еще один, менее популярный способ – использование Java классов, таких как СтартВент , Эндевент , ПользовательТаск , Последовательность Поток и так далее.

Если мы хотим запустить процесс или получить доступ к какой-либо из служб, нам необходимо создать ПроцессИнженерияКонфигурации .

Мы можем получить ПроцессИнженерный с помощью ПроцессИнженерия, в некотором смысле, которые мы обсудим далее в этой статье . Через ПроцессИнженерный мы можем выполнять операции Workflow и BPMN.

2. Мейвен зависимостей

Чтобы использовать этот API, мы должны включить зависимость Activiti:


    org.activiti
    activiti-engine

3. Создание процессаИнженерия

ПроцессИнженерный в Activiti, как правило, настроен с помощью файла XML, активити.cfg.xml . Примером этого файла конфигурации является:


    
        
        
        
        
        
    

Теперь мы можем получить ПроцессИнженерный с помощью ПроцессАнглия класс:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

Это заявление будет искать активити.cfg. xml файл в classpath, и построить ПроцессИнженерный на основе конфигурации в файле.

Пример кода для файла конфигурации показывает, что это всего лишь весенняя конфигурация. Но это не значит, что мы можем использовать Activiti только в весенней среде. Возможности Spring используются только внутренне для создания ПроцессИнженерный .

Давайте напишем тестовый случай JUnit, который создаст ПроцессИнженерный с помощью файла конфигурации, показанного выше:

@Test
public void givenXMLConfig_whenGetDefault_thenGotProcessEngine() {
    ProcessEngine processEngine 
      = ProcessEngines.getDefaultProcessEngine();
    assertNotNull(processEngine);
    assertEquals("root", processEngine.getProcessEngineConfiguration()
      .getJdbcUsername());
}

4. Api и услуги двигателя процесса Activiti

Точкой входа взаимодействия с API является ПроцессИнженерный . Через ПроцессАнглия, мы можем получить доступ к различным службам, которые предоставляют методы рабочего процесса/BPMN. ПроцессИнженерный и все объекты обслуживания безопасны для потоков.

Взятые из https://www.activiti.org/userguide/images/api.services.png

ПроцессАнглия класс будет сканировать для активити.cfg.xml и активити-контекст.xml Файлы. Как упоминалось ранее, для всех активити.cfg.xml файлы, ПроцессИнженерный будет создан в типичный способ.

В то время как, несмотря на активити-контекст.xml файлы, он будет создан весной образом – я создам контекст весеннего приложения и получу ПроцессИнженерный от этого. Во время выполнения процесса все шаги будут посещены в порядке, определенном в файле BPMN.

Во время выполнения процесса все шаги будут посещены в порядке, определенном в файле BPMN.

4.1. Определение процесса и связанные с ним термины

ПроцессОпределение представляет собой бизнес-процесс. Он используется для определения структуры и поведения различных этапов процесса. Развертывание определения процесса означает загрузку определения процесса в базу данных Activiti.

Определения процессов в основном определяются стандартом BPMN 2.0. Их также можно определить с помощью Java-кода. Все термины, определенные в этом разделе, также доступны как классы Java.

Как только мы начинаем работать определение процесса, его можно назвать процессом

A ПроцессИнстанс является одним исполнением ПроцессОпределение.

СтартВент связан с каждым бизнес-процессом. Он указывает точку входа процесса. Аналогичным образом, существует Эндевент что указывает на конец процесса. Мы можем определить условия для этих событий.

Все шаги (или элементы) между началом и концом называются Задачи . Задачи может быть различных типов. Наиболее часто используемыми задачами являются ПользовательТаскс и СервисТаскс .

ПользовательТаскс , как следует из названия, таковы, что они должны осуществляться вручную пользователем.

СервисТаскс , с другой стороны, настроены с куском кода. Всякий раз, когда выполнение достигает их, их блок кода будет выполнен.

ПоследовательностиПотоки подключить Задачи . Мы можем определить ПоследовательностиПотоки исходными и целевыми элементами, которые они подключат. Опять же, мы также можем определить условия ПоследовательностиПотоки для создания условных путей в процессе.

4.2. Услуги

Мы обсудим вкратце услуги, предоставляемые Activiti:

  • РепозиторийСервис помогает нам манипулировать развертыванием определений процессов. Эта служба имеет дело со статичными данными, связанными с определением процесса
  • Запуск службы управляет ПроцессИнсансы (в настоящее время работает процессы), а также переменные процесса
  • Служба задач отслеживает ПользовательТаскс . Задачи которые должны осуществляться вручную пользователем, находятся в основе API Activiti. Мы можем создать задачу, требовать и выполнить задачу, манипулировать назначенным заданием и т.д., используя эту услугу
  • ФормСервис является факультативной услугой. API можно использовать без него, без ущерба для любой из его функций. Он используется для определения формы начала и формы задачи в процессе.
  • Идентификационный сервис управляет Пользователи и Группы
  • ИсторияСервис отслеживает историю Activiti Engine. Мы также можем установить различные уровни истории.
  • УправлениеСервис связано с метаданными и обычно не требуется при создании приложения
  • ДинамическийBpmnService помогает нам изменить что-либо в процессе без передислокации его

5. Работа с услугами Activiti

Чтобы узнать, как мы можем работать с различными службами и запустить процесс, давайте возьмем пример процесса для “Запроса на отпуск сотрудников”:

Файл BPMN 2.0, ОтпускRequest.bpmn20.xml , для этого процесса будет иметь событие начала определяется как:


    
        
        
        
     

Аналогичным образом, первая задача пользователя, назначенная группе пользователей “управление”, будет выглядеть так:


    ${employeeName} would like to take ${numberOfDays} day(s)
      of vacation (Motivation: ${reason}).
    
        
        
    
    
      
        management
      
    

С СервисТаск, мы должны определить часть кода, который будет выполнен. У нас есть этот фрагмент кода как класс Java:


Условный поток будет показан путем добавления “условиеЭкспрессия” тег в “sequenceFlow”:


    
      

Вот, отпускОдобы является формаПропертия из ПользовательТаск показано выше.

Как мы видим на диаграмме, это очень простой процесс. Сотрудник делает запрос на отпуск, предоставляя количество дней и дату начала отпуска. Запрос идет к менеджеру. Они могут одобрить/отклонить запрос.

В случае одобрения для отправки подтверждения электронной почты определена задача службы. В случае неодобрения Сотрудник может либо изменить и повторно издать запрос, либо ничего не делать.

Задачи службы предоставляются с некоторой частью кода для выполнения (здесь, как класс Java). Мы дали классную SendEmailServiceTask.java.

Эти типы классов должны расширить JavaDelegate. Кроме того, мы должны переопределить его выполнить () метод, который будет выполнен, когда выполнение процесса достигнет этого шага.

5.1. Развертывание процесса

Чтобы сделать наш процесс известным двигателю Activiti, нам необходимо развернуть этот процесс. Мы можем сделать это программно, используя РепозиторийСервис. Давайте напишем тест JUnit, чтобы показать это:

@Test 
public void givenBPMN_whenDeployProcess_thenDeployed() {
    ProcessEngine processEngine 
      = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService 
      = processEngine.getRepositoryService();
    repositoryService.createDeployment()
      .addClasspathResource(
      "org/activiti/test/vacationRequest.bpmn20.xml")
      .deploy();
    Long count=repositoryService.createProcessDefinitionQuery().count();
    assertEquals("1", count.toString());
}

Развертывание означает, что движок будет анализировать файл BPMN и преобразовывать его во что-то выируемое. Кроме того, запись будет добавлена в таблицу Репозитория для каждого развертывания.

Следовательно, после этого мы можем запросить Репозиторий службы для управления развернутыми процессами; ПроцессДефиниции .

5.2. Начало процессаInstance

После развертывания ПроцессОпределение для Activiti Engine, мы можем выполнить процесс, создавая ПроцессИнсансы . ПроцессОпределение это план, и ПроцессИнстанс является выполнением времени выполнения его.

За одну ПроцессОпределение , может быть несколько ПроцессИнсансы .

Все детали, связанные с ПроцессИнсансы доступ через Запуск службы .

В нашем примере, на старте мероприятия, мы должны пройти количество дней отпуска, дату начала, и причина. Мы будем использовать переменные процесса и передавать их при создании ПроцессИнстанс.

Давайте напишем тестовый случай JUnit, чтобы получить лучшую идею:

@Test
public void givenDeployedProcess_whenStartProcessInstance_thenRunning() {
    //deploy the process definition    
    Map variables = new HashMap>();
    variables.put("employeeName", "John");
    variables.put("numberOfDays", 4);
    variables.put("vacationMotivation", "I need a break!");
    
    RuntimeService runtimeService = processEngine.getRuntimeService();
    ProcessInstance processInstance = runtimeService
      .startProcessInstanceByKey("vacationRequest", variables);
    Long count=runtimeService.createProcessInstanceQuery().count();
 
    assertEquals("1", count.toString());
}

Несколько экземпляров определения одного процесса будут отличаться по переменным процесса.

Существует несколько способов запуска экземпляра процесса. Здесь мы используем ключ процесса. После запуска экземпляра процесса мы можем получить информацию о нем, запросив Запуск службы .

5.3. Выполнение задач

Когда наш экземпляр процесса начинает работать, первым шагом является задача пользователя, назначенная группе пользователей “управление”.

Пользователь может иметь почтовый ящик, который будет иметь список задач, которые должны быть сделаны ими. Теперь, если мы хотим продолжить выполнение процесса, пользователь должен закончить эту задачу. Для Activiti Engine это называется “выполнение задачи”.

Мы можем запросить Служба задач, чтобы получить объект задачи, а затем завершить его.

Код, который мы должны написать для этого выглядит так:

@Test 
public void givenProcessInstance_whenCompleteTask_thenGotNextTask() {
    // deploy process and start process instance   
    TaskService taskService = processEngine.getTaskService();
    List tasks = taskService.createTaskQuery()
      .taskCandidateGroup("management").list();
    Task task = tasks.get(0);
    
    Map taskVariables = new HashMap<>();
    taskVariables.put("vacationApproved", "false");
    taskVariables.put("comments", "We have a tight deadline!");
    taskService.complete(task.getId(), taskVariables);

    Task currentTask = taskService.createTaskQuery()
      .taskName("Modify vacation request").singleResult();
    assertNotNull(currentTask);
}

Обратите внимание, что полный () метод Служба задач также принимает в требуемых переменных процесса. Мы перемытяем ответ от менеджера.

После этого процесс двигателя будет продолжаться до следующего шага. Здесь следующий шаг задает сотруднику вопрос о том, следует ли повторно отправить запрос на отпуск или нет.

Итак, наши ПроцессИнстанс в настоящее время ждет на этом UserTask, который имеет название “Изменить отпуск запрос”.

5.4. Приостановка и активация процесса

@Test(expected = ActivitiException.class)
public void givenDeployedProcess_whenSuspend_thenNoProcessInstance() {
    // deploy the process definition
    repositoryService.suspendProcessDefinitionByKey("vacationRequest");
    runtimeService.startProcessInstanceByKey("vacationRequest");
}	

Чтобы активировать его снова, нам просто нужно позвонить одному из репозиторийService.activateProcessDefinitionXXX методика.

Аналогичным образом, мы можем приостановить ПроцессИнсанс, с помощью Служба выполнения.

6. Заключение

В этой статье мы увидели, как мы могли бы использовать Activiti с Java. Мы создали образец ПроцессИнженерия файл, который помогает нам создать ПроцессИнженерный .

Используя его, мы получили доступ к различным услугам, предоставляемым API. Эти услуги помогают нам управлять и отслеживать ПроцессДефиниции , ПроцессИнсансы , ПользовательТаскс и так далее.

Как всегда, код для примеров, которые мы видели в статье, более на GitHub .