Есть процесс с основной переменной процесса a.
ServiceTask посредством бина создает набор дочерних объектов.
Последующий EntityDataTask пытается начитать эти дочерние сущности в коллекцию.
НО!!! у него ничего не получается. JPQL запрос возвращает null, даже если ServiceTask возвращает созданные дочерние объекты как коллекцию.
Добрый день!
Если на EntityDataTask вы установите флаг Asynchronous, то проблема не решится?
Пробовали, не помогает…
Установка этого флага вызывает проблемы иного рода, начинаются ошибки несанкционированного доступа из-за разделения контекстов
Сделайте, пожалуйста, маленький демо-проект, на котором воспроизводится ошибка. Попробуем запустить и посмотреть в чём проблема.
Так что там выгружать? он нарисован в первом сообщении.
в старт-event’е объявлена одна переменная типа entity
Сервисный таск бином создает несколько дочерних объектов со связью 1:N.
Дата таск пытается начитать все дочерние элементы базового объекта и возвращает null.
Все, процесс завершен.
Добрый день!
Сделал проект с процессом, похожим на ваш, и у меня всё работает.
Вот мой “законченный” проект с сервисом и задеплоенным процессом:
bpm-quad.zip (125.2 КБ)
В нём можно запустить процесс и увидеть, что все нужные переменные сохранены и прочитаны.
Если сходу не заметите особых отличий с тем, что делаете вы, пожалуйста, сделайте законченный мини-проект с сервисом и процессом, который я смогу запустить на своей машине и сразу же увидеть неверное поведение, о котором вы говорите.
Максим, добрый день.
Спасибо за Ваше тестовое приложение. К сожалению, ошибка повторяется и в нем.
Для этого необходимо соблюсти условия, написанные в первом посте данной темы. А именно: шаг начитки JPQL д.б. синхронный (в приложении он асинхронный).
Условия тестирования:
Репозитории изменены на global.repo.jmix.io
PostgreSQL – v13
ОШИБКА 1 (для HSQLDB)
— снимаем флаг «Асинхронный » с JPQL-шага процесса,
— публикуем процесс,
— запускаем процесс.
ОЩИБКА: запуск процесса подвисает (висит окно запуска процесса \ браузер). Можно закрыть браузер и зайти в приложение повторно, при этом в ProcessInstance запись не появляется
Пробовали для двух рабочих станций, разных Java и в разных браузерах (Edge, Chrome).
ОШИБКА 2 (для СУБД PostgreSQL (v 13)) – аналогично первому посту
— Импортируем базовый процесс, выгруженный из БД HSQLDB,
— снимаем флаг «Асинхронный» с JPQL-шага,
— публикуем процесс,
— запускаем процесс.
ОШИБКА: после запуска процесса смотрим результат в ProcessInstance (см скриншот). Результат JPQL запроса NULL
А зачем снимать флаг “Асинхронный” - если его смысл тут как раз и есть в том, чтобы поправить данную проблему (entityDataTask не видит данных, которые создали на этапе перед ней)?
Вы писали, что
Я просто не очень понял, что тут имеется в виду. У меня с этим флагом с сэмпл-проекте никаких ошибок не возникло.
Т.е. Вы подтверждаете, что в случае синхронного выполнения ошибка присутствует?
В таком случае ее надо исправлять.
Асинхронность последующего шага создает непредсказуемость поведения системы в смысле логирования процесса и были проблемы следующего порядка:
Мы запускали свой процесс от имени пользователя с ограниченными правами. При синхронном выполнении все шаги выполняются от имени этого пользователя и с его доступами. В случае асинхронного шага - это не так. Асинхронный шаг почему-то выполнялся от имени какого-то другого пользователя, что приводило к ошибкам доступа.
Именно из-за этого, опцию асинхронности мы подробно не исследовали и исключили из рассмотрения.
Это не ошибка. Это ожидаемое поведение. Подробнее про флаг asynchronous можно почитать в документации Flowable. Суть в том, что если вы его не поставите, то и сервис-таска и entity-data-task у вас будут выполняться в одной транзакции. Т.е. сервис таской вы создаёте какие-то данные, не коммитите транзакцию и внутри этой же транзакции тут же пытаетесь их зачитать с помощью entity-data-task. Поэтому entity-data-task ничего и не возвращает. Если поставить флаг asynchronous, то перед entity-data-task предыдущая транзакция завершится, все данные закоммитятся и entity-data-task спокойно их зачитает.
Вот совершенно не понятно почему это entity-data-task ничего не возвращает и вы считаете такое поведение правильным. Как раз измененные данные внутри транзакции должны быть видны по умолчанию и entity-data-task должен возвращать обновленные данные. В том то и дело!!!