Как получить текущий экземпляр Activiti ProcessInstance в SpringBean?

Я пытаюсь заставить рабочий процесс работать с использованием Activiti 5.5 с использованием механизма управляемых процессов Spring, и у меня возникают некоторые проблемы.

У меня есть ServiceTask в моем рабочем процессе, который разрешается в Spring Managed bean. Это выглядит так:

<serviceTask id="springTask1" name="BeanTest" activiti:delegateExpression="${taskBean}"></serviceTask>

Я не запускаю процесс через код, процесс либо запускается через API-интерфейс activti-rest, либо через форму. Как я могу получить контекст, в котором выполняется эта задача, изнутри компонента, чтобы я мог добавить переменную процесса, на которую можно было бы сослаться в более поздней задаче, например, в электронном письме. Я попытался посмотреть на весенние примеры, которые поставляются с Activiti 5.5, и я не вижу, чем мой пример отличается от примеров. Я реализую интерфейс JavaDelegate так же, как показано в весеннем примере.

Вот мой код:

public class GetBeanTest implements JavaDelegate {

private ContactService contactService;

public GetBeanTest() {
    super();
}

public String getContactName(String contactName) throws Exception {
    String retVal= "unknown";
    if(contactService == null){
        System.out.println("Bean was null!");
    }else{
        System.out.println("Bean is valid!");
        List<Contact> contacts= contactService.getContacts();
        System.out.println("There are " + contacts.size() +" in the contact list.");
        for (Contact contact : contacts) {
            if(contact.getName().equalsIgnoreCase(contactName)){
                System.out.println("Found the contact! " + contactName );
                retVal= contact.getEmail();
            }
        }
    }
    return retVal;

}

public void setContactService(ContactService contactService) {
    this.contactService = contactService;
}

@Override
public void execute(DelegateExecution execution) throws Exception {
    System.out.println("+++++++++++++ in execute ++++++++++++++++");
    System.out.println("Event Name: " + execution.getEventName());
    System.out.println("ID: " + execution.getId());
    System.out.println("Process Instance ID: " + execution.getProcessInstanceId());
    Set<String> varNames= execution.getVariableNames();
    for (String string : varNames) {
        System.out.println("Varible Named " + string + " exists");
        if(string.equalsIgnoreCase("contactName")){
            String contactName= (String) execution.getVariable(string);
            getContactName(contactName);
        }else{
            System.out.println("unable to find contact name.");
        }
    }
}

}

Вот конфигурация весны (для краткости скучные части опущены):

<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
  </bean>

<!--Dao Beans -->
<bean id="contactDao" class="org.psc.database.dao.jpa.ContactDaoImpl"/>

<!--  Service Beans -->

  <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
  <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
  <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
  <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />

<bean id="contactService" class="org.psc.service.impl.ContactServiceImpl">
    <property name="contactDao" ref="contactDao"/>
</bean>

<bean id="contact" class="org.psc.bpmn.tasks.Contact"/>
<bean id="taskBean" class="org.psc.bpmn.examples.GetBeanTest">
        <property name="contactService" ref="contactService"/>
</bean>

Когда я запускаю рабочий поток, я получаю сообщение об ошибке:

06090000 Wrapped Exception (с шаблоном состояния): выражение делегата ${taskBean} не разрешается в реализацию интерфейса org.activiti.engine.impl.pvm.delegate.ActivityBehavior или интерфейса org.activiti.engine.delegate.JavaDelegate

Любые/все ответы приветствуются! Заранее спасибо.


person Griff    schedule 09.07.2011    source источник


Ответы (2)


Вы также можете использовать spring bean-компоненты в сервисных задачах:

  1. Вы должны создать управляемый bean-компонент spring (реализует JavaDelegate не требуется)
  2. используйте эту конфигурацию в ServiceTask: activiti:expression="${taskBean.someMethod()}"

Я всегда использую эту конфигурацию в весенней среде. Надеюсь, поможет!

Леви

person lepike    schedule 13.09.2011

  1. Получите ProcessEngine
  2. Получить службу задач
  3. Создайте запрос, чтобы найти экземпляр процесса, taskService.createTaskQuery()
  4. Наконец, task.getProcessInstanceId()
person Diego Padilla    schedule 11.06.2020