Замена BPM аддон на новый BProc аддон в действующем приложении

Есть приложение, использующее старый аддон BPM и как минимум несколько его экземпляров у различных клиентов.
Нужно заменить в приложении старый аддон BPM на новый аддон BProc.

В моих радужных мечтах рисовался простой путь:

  1. На первом этапе не трогаем ничего, что касается старого BPM и Добавляем в приложение новый BProc.
  2. Свойством приложения пока запрещаем работать с новым BProc и даем возможность завершить запущенные ранее процессы на старом движке. Когда активных старых процессов не остается - свойством приложения “отключаем” старый BPM и даем возможность запускать процессы у же только в новом аддоне BProc.

При ближайшем рассмотрении оказалось, что два эти аддона не живут в одном приложении.
Как минимум у них есть часть одноименных таблиц в БД.

Может кто-то уже проходил подобный квест и может порекомендовать примерный путь решения задачи?
В программе минимум надо просто перескочить с BPM на BProc на работающем приложении, но с потерей данных о старых процессах, выполненных в BPM.
В идеале надо перейти на новый аддон, сохранив возможность просмотра хоть в каком-то виде истории запуска старых процессов.

Предварительно, получилось скрестить “ежа с ужом” без потери информации о старых процессах, выполненных в старом аддоне и добавить в приложение новый Bproc.
Будем пытаться пройти по программе максимум и перевести приложение на работу с BProc с сохранением возможности просмотра старой информации.

Мы когда-то решали эту задачу путём использования префикса перед именами таблиц БД Activiti.

В spring.xml можно переписать processEngineConfiguration:

    <bean id="processEngineConfiguration" class="com.haulmont.bpm.core.engine.cfg.ExtSpringProcessEngineConfiguration">
            <property name="dataSource" ref="cubaDataSource"/>
            <property name="transactionManager" ref="transactionManager"/>
            <property name="scriptingEngines" ref="scriptingEngines"/>
    
            <property name="asyncExecutorEnabled" value="${bpm.activiti.asyncExecutorEnabled?:false}" />
            <property name="asyncExecutorActivate" value="false"/>
            <property name="preBpmnParseHandlers">
                <list>
                    <bean class="com.haulmont.bpm.core.engine.parser.BpmUserTaskParseHandler"/>
                </list>
            </property>
    
            <property name="databaseTablePrefix" value="old_"/>
        </bean>

Тут самое главное вот это свойство:

<property name="databaseTablePrefix" value="old_"/>

Оно говорит, что все таблицы activiti теперь должны иметь в своём имени этот префикс, т.е. old_act_ru_task вместо act_ru_task.

Вот пример скрипта обновления БД, который изменяет имена таблиц Activiti:
rename-activiti-tables.sql.zip (2.7 КБ)

Его надо применить перед добавлением в проект аддона BProc.

1 симпатия

Благодарю!
Это сильно сэкономит время :slight_smile:

А побороть одноименность бинов ProcessAdminRoleDefinition и ProcessActorRoleDefinition в адонах как-то можно кроме как их рефакторингом в аддоне BPM?

Это роли, не бины. И имена у них вроде бы разные, у одних имена начинаются с bpm- у других с bproc-
Какие проблемы с ними?

После добавления BProc в проект со старым аддоном приложение валится ругаясь, что bpm и bproc содержат одноимённые ProcessAdminRoleDefinition и ProcessActorRoleDefinition.

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [com/haulmont/addon/bproc/spring.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'processAdminRoleDefinition' for bean class [com.haulmont.addon.bproc.role.ProcessAdminRoleDefinition] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.bpm.role.ProcessAdminRoleDefinition]...

Пока для опытов просто сделал форк BPM, добавил к их именам Old и использую в проекте эту сборку.