Зависает форма моделирование BPM

Добрый вечер,

Версия Jmix - 2.0.2.

При попытке добавить сервисную задачу в форме “Моделирование процессов” приложение иногда зависает.

Stacktrace из thread dump:

java.lang.Thread.State: RUNNABLE
	  at java.lang.StringLatin1.compareTo(StringLatin1.java:115)
	  at java.lang.StringLatin1.compareTo(StringLatin1.java:110)
	  at java.lang.String.compareTo(String.java:2020)
	  at java.lang.String.compareTo(String.java:140)
	  at java.util.TreeMap.put(TreeMap.java:814)
	  at java.util.TreeMap.put(TreeMap.java:534)
	  at io.jmix.bpm.reflection.BpmBeansMetadataService.lambda$init$1(BpmBeansMetadataService.java:93)
	  at io.jmix.bpm.reflection.BpmBeansMetadataService$$Lambda$3400/0x000001b04021e220.accept(Unknown Source:-1)
	  at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	  at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
	  at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	  at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
	  at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754)
	  at java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:373)
	  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:-1)
	  at java.util.concurrent.ForkJoinPool.helpComplete(ForkJoinPool.java:1950)
	  at java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:433)
	  at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:687)
	  at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
	  at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
	  at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
	  at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	  at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:765)
	  at io.jmix.bpm.reflection.BpmBeansMetadataService.init(BpmBeansMetadataService.java:72)
	  at io.jmix.bpm.reflection.BpmBeansMetadataService.checkInitialized(BpmBeansMetadataService.java:55)
	  at io.jmix.bpm.reflection.BpmBeansMetadataService.getAvailableBeans(BpmBeansMetadataService.java:42)
	  at io.jmix.bpmflowui.util.BeanMethodModelHelper.getAvailableBeans(BeanMethodModelHelper.java:303)
	  at io.jmix.bpmflowui.view.modeler.properties.servicetask.ServiceTaskPropertiesFragment.initSpringBeanFields(ServiceTaskPropertiesFragment.java:227)
	  at io.jmix.bpmflowui.view.modeler.properties.servicetask.ServiceTaskPropertiesFragment.beforeShow(ServiceTaskPropertiesFragment.java:130)
	  at io.jmix.bpmflowui.view.modeler.properties.servicetask.ServiceTaskPropertiesFragment$$Lambda$3355/0x000001b0402153d0.onComponentEvent(Unknown Source:-1)
...

Проблема воспроизводится нестабильно (на мой машине примерно в 20% случаев), иногда вместо зависания возникают ошибки (например, java.lang.NullPointerException: Cannot read field "right" because "l" is null).

Вероятная причина проблемы - в методе BpmBeansMetadataService#init используются параллельные стримы (Arrays.stream(beanDefinitionNames).parallel()), которые изменяют несинхронизированную коллекцию beansMetadata.

Спасибо за сообщение об ошибке. Завёл issue.

1 симпатия