На BPM 7.2.8 processRuntimeService.startProcess не запускает процесс. Cannot get unfetched attribute [actProcessInstanceId]

Есть приложение, в котором у нас реализован свой экран запуска процессов.
На платформе 7.1.4 и соответствующей версией addon BPM на продакшене все работает.
Обновили платформу и addon BPM на 7.2.8 и запуск процесса работать перестал.

Валится вот на этом участке:

....
List<Entity> commitInstances = new ArrayList<>();
...
//Укомплектовали и добавили в commitInstances procInstance, procActors ...
...
Map<String, Object> procParam = new HashMap<>();
//Заполнили параметры процесса....
.....
//Камитим все необходимое для запуска процесса
Set<Entity> commitedEntities = dataManager.commit(new CommitContext(commitInstances));
commitedEntities.stream()
                    .filter(entity -> entity instanceof ProcInstance)
                    .findFirst()
                    .ifPresent(entity -> {
                        ProcInstance p = processRuntimeService.startProcess((ProcInstance) entity, null, procParam); //Cannot get unfetched attribute [actProcessInstanceId]
if (p.getActive()) {......}
...
                       });

На вызове processRuntimeService.startProcess((ProcInstance) entity, null, procParam) получаем ошибку.

java.lang.IllegalStateException

java.lang.IllegalStateException: Cannot get unfetched attribute [actProcessInstanceId] from detached object com.haulmont.bpm.entity.ProcInstance-ecaf9f1e-c9fb-f65d-8281-86e090cad4e5 [detached]
at org.eclipse.persistence.internal.queries.EntityFetchGroup.onUnfetchedAttribute(EntityFetchGroup.java:100) ~[org.eclipse.persistence.core-2.7.3-7-cuba.jar:na]
at com.haulmont.cuba.core.sys.persistence.CubaEntityFetchGroup.onUnfetchedAttribute(CubaEntityFetchGroup.java:74) ~[cuba-global-7.2.8.jar:7.2.8]
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2998) ~[org.eclipse.persistence.jpa-2.7.3-7-cuba.jar:na]
at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java) ~[cuba-global-7.2.8.jar:7.2.8]
at com.haulmont.bpm.entity.ProcInstance._persistence_get_actProcessInstanceId(ProcInstance.java) ~[bpm-global-7.2.8.jar:7.2.8]
at com.haulmont.bpm.entity.ProcInstance.getActProcessInstanceId(ProcInstance.java:162) ~[bpm-global-7.2.8.jar:7.2.8]
at com.haulmont.bpm.entity.ProcInstance.setActProcessInstanceId(ProcInstance.java) ~[bpm-global-7.2.8.jar:7.2.8]
at com.haulmont.bpm.core.ProcessRuntimeManagerBean.startProcess(ProcessRuntimeManagerBean.java:103) ~[bpm-core-7.2.8.jar:7.2.8]
at com.haulmont.bpm.service.ProcessRuntimeServiceBean.startProcess(ProcessRuntimeServiceBean.java:37) ~[bpm-core-7.2.8.jar:7.2.8]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) ~[spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:90) ~[cuba-core-7.2.8.jar:7.2.8]
at sun.reflect.GeneratedMethodAccessor262.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) [spring-aop-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at com.sun.proxy.$Proxy330.startProcess(Unknown Source) [na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) [cuba-core-7.2.8.jar:7.2.8]
at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:159) [cuba-web-7.2.8.jar:7.2.8]
at com.sun.proxy.$Proxy72.startProcess(Unknown Source) [na:na]
at ru.cs_consult.simpledoc.web.screens.Startapprovescreen.lambda$prepareAndStartApprove$8(Startapprovescreen.java:508) [vedoc-web-1.2.14.0.jar:na]
at java.util.Optional.ifPresent(Optional.java:159) ~[na:1.8.0_191]
at ru.cs_consult.simpledoc.web.screens.Startapprovescreen.prepareAndStartApprove(Startapprovescreen.java:507) [vedoc-web-1.2.14.0.jar:na]
at ru.cs_consult.simpledoc.web.screens.Startapprovescreen.onStartButtonClick(Startapprovescreen.java:326) [vedoc-web-1.2.14.0.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:101) ~[cuba-gui-7.2.8.jar:7.2.8]
at com.haulmont.cuba.web.gui.components.WebButton.buttonClicked(WebButton.java:67) ~[cuba-web-7.2.8.jar:7.2.8]
at com.haulmont.cuba.web.widgets.CubaButton.fireClick(CubaButton.java:76) ~[cuba-web-widgets-7.2.8.jar:na]
at com.vaadin.ui.Button$1.click(Button.java:57) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:153) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:115) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:431) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:396) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:260) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:82) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1578) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.9.2-15-cuba.jar:8.9.2-15-cuba]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.2.8.jar:7.2.8]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.2.8.jar:7.2.8]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.27]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.2.8.jar:7.2.8]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[catalina.jar:9.0.27]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[catalina.jar:9.0.27]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.27]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) ~[catalina.jar:9.0.27]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[catalina.jar:9.0.27]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[catalina.jar:9.0.27]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) ~[tomcat-coyote.jar:9.0.27]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) ~[tomcat-coyote.jar:9.0.27]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) ~[tomcat-coyote.jar:9.0.27]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) ~[tomcat-coyote.jar:9.0.27]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.27]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_191]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_191]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.27]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_191]

Пошаговый дебаг processRuntimeService.startProcess показывает что startProcess отрабатывает почти до конца и валится на 103 строке.
image
Видно, что в activitiProcessInstance есть processInstanceId, но activitiProcessInstance.getProcessInstanceId() вызывает ошибку Cannot get unfetched attribute.

В чем может быть проблема и как ее лечить?
С виду, код нашего экрана на возникновение этой ошибки влиять не должен…
Git говорит, что код нашего экрана не почти менялся относительно того, который работает на платформе 7.1.4.
“Почти” - это добавленные в нескольких местах записи в лог.

Очень хочется доковылять на старом BPM и Platform 7.2 до конца года, а там уже спокойно заниматься переездом на новый addon Bpoc

Не обязательно коммитить явно сущности процесса (procInstance, procActor и т.п.) перед передачей в processRuntimeService.startProcess. Метод startProcess умеет сам сохранять граф объектов. Попробуйте сделать, как в этом примере. Имею в виду вот эту часть:

            BpmEntitiesService.ProcInstanceDetails procInstanceDetails = new BpmEntitiesService.ProcInstanceDetails(PROCESS_CODE)
                    .addProcActor("initiator", getEditedEntity().getInitiator())
                    .addProcActor("executor", getEditedEntity().getExecutor())
                    .setEntity(getEditedEntity());

            /*The created ProcInstance will have two proc actors. None of the entities is persisted yet.*/
            ProcInstance procInstance = bpmEntitiesService.createProcInstance(procInstanceDetails);

            /*A map with process variables that must be passed to the Activiti process instance when it is started. This variable is used in the model to make a decision for one of gateways.*/
            HashMap<String, Object> processVariables = new HashMap<>();
            processVariables.put("acceptanceRequired", getEditedEntity().getAcceptanceRequired());

            /*Starts the process. The "startProcess" method automatically persists the passed procInstance with its actors*/
            processRuntimeService.startProcess(procInstance, "Process started programmatically", processVariables);

Проект с сэмплами, если что, есть на гитхабе.

Если не поможет, то сделайте, пожалуйста, демо-проект с воспроизведением вашей ошибки.

1 симпатия

Спасибо @gorbunkov, пример хороший.
Попробовал, именно этот рецепт не помог, но проблему похоже решил. :slight_smile:

Дело было даже не в экране, а в процессе и в коде NotifyBPMTaskListener.
При назначении таски нам надо рассылать уведомление пользователю и перед рассылкой уведомления procInstance, с которым связана таска, перечитывается с нужным нам представлением.
Тут коса на камень вокруг procInstance похоже и находит.

В модели процесса поставил на User task флаг Asynchronous и проблема рассосалась.
Хотя, эта же модель процесса и этот же код NotifyBPMTaskListener на 7.1 не вызывали такого схлестывания за procInstance.