Как обработчик рабочих элементов внутри KJAR можно зарегистрировать с помощью автоматической регистрации компонентов Spring? - PullRequest
0 голосов
/ 11 июня 2019

Мы используем версию kie 7.22.0.Final.

Сценарий, который мы хотим реализовать, следующий:

  • Наличие бизнес-приложения с несколькими кьярами.Каждый из этих kjars должен быть зарегистрирован в разных версиях этого бизнес-приложения.Внутри kjar мы хотим использовать специальные обработчики рабочих элементов для обработки некоторых вариантов использования.Как часть изменения в существующем определении рабочего процесса, нам, возможно, потребуется изменить бизнес-логику внутри обработчика рабочего элемента.

  • Например:

    • в кьяре A (версия 1) у нас есть рабочий обработчик X (версия 1)
    • в кьяре A (версия 2) у нас есть рабочий обработчик X (версия 1)
    • в кьяре A (версия 3) у нас есть рабочий обработчик X (версия 2)
  • Мы также хотимиспользуйте Spring, чтобы нести ответственность за создание объекта, потому что мы хотим использовать возможность Spring вставлять вещи в обработчик workitemhandler.

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

@Component(“MyTask”) 
public class MyTaskWorkItemHandler implements WorkItemHandler { 
 static int executeWorkItemCounter = 0; 
 static int abortWorkItemCounter = 0; 
 int hashValue = 0; 

 public MyTaskWorkItemHandler() { 
    this.hashValue = this.hashCode(); 
    System.out.println("--LOG-- constructor this.hashCode()= " + this.hashValue); 
 }  

 @Override 
 public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { 
    executeWorkItemCounter++; 
    System.out.println("--LOG-- MyTaskWorkItemHandler Hash Value = " + this.hashValue); 
    System.out.println("--LOG-- Counter: Number of MyTaskWorkItemHandler executions = " + executeWorkItemCounter); 
    System.out.println("--LOG-- Work item V.0.0.1 being executed -inside kjar-" + workItem); 
    manager.completeWorkItem(workItem.getId(), null); 
 } 

 @Override 
 public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { 
    abortWorkItemCounter++; 
    System.out.println("--LOG-- Counter abortWorkItem -inside kjar-" + abortWorkItemCounter); 
 } 
}

Мы хотим зарегистрировать обработчик рабочих элементов с помощью автоматической регистрации компонентов Spring .(как описано в документации по jbpm)

Если мы поместим класс в kjar, экземпляр не будет создан.

Помещение этого обработчика рабочих элементов в состав службы весенней загрузки, содержащей бизнес-приложение, работает нормально (из-за сканирования компонентов внутри службы).НО, как описано выше, нам нужно обработать конкретную версию этого класса для конкретной версии kjar.(kjar содержит определение рабочего процесса, в котором используется обработчик workitemhandler)

Кроме того, размещение kjar в качестве maven-зависимости от сервисного проекта прекрасно работает для использования Spring для создания экземпляра worktitemhandler. НО снова это будет тормозить управление версиями workitemhandler, потому что нам нужно было бы поместить разные версии kjar в качестве зависимости.И это приведет к проблемам с загрузчиком классов.

Мы попытались зарегистрировать этот обработчик рабочих элементов в файле kie-deploy-descriptor.xml файла kjar, используя преобразователь «spring».Но это не сработало:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<deployment-descriptor xsi:schemaLocation="http://www.jboss.org/jbpm deployment-descriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<persistence-unit>org.jbpm.domain</persistence-unit> 
<audit-persistence-unit>org.jbpm.domain</audit-persistence-unit> 
<audit-mode>JPA</audit-mode> 
<persistence-mode>JPA</persistence-mode> 
<runtime-strategy>SINGLETON</runtime-strategy> 
<marshalling-strategies/> 
<event-listeners/> 
<task-event-listeners/> 
<globals/> 
<work-item-handlers> 
    <work-item-handler> 
        <resolver>spring</resolver> 
        <identifier>MyTask</identifier> 
    </work-item-handler> 
</work-item-handlers> 
<environment-entries/> 
<configurations/> 
<required-roles/> 
<remoteable-classes/> 
<limit-serialization-classes>true</limit-serialization-classes> 

Что мы делаем не так?

Что необходимо для использования пружинного резольвераправильно? (И достичь нашей цели создания версий Workitemhandler внутри kjar-версии ...)

...