Асинхронное задание в активи не выполнено - PullRequest
0 голосов
/ 07 октября 2019

У меня проблема с простым рабочим процессом, реализованным с помощью обработчика activiti и Java. Я не могу выполнить задачу асинхронно. Рабочий процесс очень прост enter image description here

В верхней части рабочего процесса запускается процесс, запускается «Задача запуска службы», подается сигнал, выполняется «Задача обслуживания цикла» и повторяется 10. раз. Нижняя часть запускается сигналом, излучаемым в верхней части, и должна выполняться асинхронно относительно части цикла, но на самом деле она блокирует «Задачу службы цикла».

Я пытаюсь установить атрибут async в нижней части. поток, но в этом случае дно не выполняется. Перейдите по ссылке на проект GitHub. https://github.com/giane88/testActiviti

package configuration;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.impl.asyncexecutor.AsyncExecutor;
import org.activiti.engine.impl.asyncexecutor.ManagedAsyncJobExecutor;
import org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration;

public class WorkflowConfiguration {
  final ProcessEngine processEngine;

  public WorkflowConfiguration(final String workFlowName) {
    processEngine = setUpProcessEngine(workFlowName);
  }

  public ProcessEngine getProcessEngine() {
    return processEngine;
  }

  private ProcessEngine setUpProcessEngine(String workFlowName) {
    ProcessEngineConfiguration cfg = null;
    cfg = new StandaloneProcessEngineConfiguration()
        .setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000")
        .setJdbcUsername("sa")
        .setJdbcPassword("")
        .setJdbcDriver("org.h2.Driver")
     .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    final ProcessEngine processEngine = cfg.buildProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addClasspathResource("activiti/" + workFlowName)
        .deploy();
    return processEngine;
  }

}
package configuration;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.runtime.ProcessInstance;

import java.util.HashMap;
import java.util.Map;

public class WorkflowManipulator {
  private final Map<String, Object> nextDelegateVariables ;
  private final String wfName;
  private final ProcessEngine engine;

  public WorkflowManipulator(String wfName, ProcessEngine engine) {
    this.nextDelegateVariables = new HashMap<>();
    this.wfName = wfName;
    this.engine = engine;
  }


  public ProcessInstance startProcess() {
    if (nextDelegateVariables.size() > 0) {
      return engine.getRuntimeService().startProcessInstanceByKey(wfName, nextDelegateVariables);
    } else {
      return engine.getRuntimeService().startProcessInstanceByKey(wfName);
    }
  }
}
@Log4j2
public class TestWorkFlowMain {

  public static void main(String[] args) throws IOException {

    WorkflowConfiguration workflowConfiguration = new WorkflowConfiguration("test.bpmn");
    WorkflowManipulator workflowManipulator = new WorkflowManipulator("testProcess", workflowConfiguration.getProcessEngine());
    ProcessInstance processInstance = workflowManipulator.startProcess();
  }
}
package delegates;

import lombok.extern.log4j.Log4j2;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

@Log4j2
public class AsyncServiceTask implements JavaDelegate {
  @Override
  public void execute(DelegateExecution execution) throws Exception {
    log.info("Sleeping for 3 second");
    Thread.sleep(3000);
    log.warn("AsyncCompleted");
  }
}

1 Ответ

1 голос
/ 07 октября 2019

Как обычно, я нашел решение через несколько минут после публикации вопроса. Проблемы были в конфигурации механизма процесса, вам нужно настроить asyncExecutor, включить и активировать его, как в примере ниже.

    ProcessEngineConfiguration cfg;
    AsyncExecutor asyncExecutor = new ManagedAsyncJobExecutor();
    cfg = new StandaloneInMemProcessEngineConfiguration()
        .setAsyncExecutor(asyncExecutor)
        .setAsyncExecutorEnabled(true)
        .setAsyncExecutorActivate(true);
    final ProcessEngine processEngine = cfg.buildProcessEngine();
...