Spring - Могут ли 2 приложения одновременно использовать один и тот же сервис @Transactional? - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над двумя проектами Spring, одним веб-приложением и одним автономным бэкэнд-сервисом. Оба используют Hibernate и одну и ту же базу данных. Поскольку оба проекта использовали свои собственные копии большинства классов Service и Repository, у меня было много дублирующегося кода, и это становилось настоящим кошмаром для собственного управления более чем 47 000 строк кода. Поэтому я решил создать третий проект, который по сути использую в качестве библиотеки классов. Он хранит классы сущностей, классы обслуживания и классы репозитория и добавляется как зависимость Maven к каждому проекту. Все работало безупречно, прежде чем я сделал это важное изменение.

Веб-приложение работает отлично, но служба вообще не запускается. Это трассировка стека:

Exception in thread "Test Legacy Orders Server Init Thread" Exception in thread "Test Legacy Formulary Server Init Thread" org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:564)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy79.logInfo(Unknown Source)
at com.mdenis.mdhis_service.connectivity.HL7TestServer.start(HL7TestServer.java:69)
at com.mdenis.mdhis_service.core.MDHIS_Service$7.run(MDHIS_Service.java:311)

Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed
at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:498)
at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:769)
at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:142)
at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:252)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1229)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:449)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:456)
... 9 more

Единственное, что я изменил в своем классе HibernateUtil, это строка:

sessionFactory.setPackagesToScan(new String[] {"com.mdenis.mdhis_common.entity"});

, который является новым пакетом, содержащим сущности в общем JAR-файле. Я точно знаю, что Hibernate правильно инициализируется с новыми настройками, поскольку с этой самой службы успешно проходят транзакции через базу данных. Одна вещь, которую я замечаю, заключается в том, что основной поток выглядит нормально. Это приложение является многопоточным, и эта проблема возникает только у дочерних потоков.

До моего масштабного рефакторинга у каждого проекта был свой локальный класс обслуживания @Transactional, и все работало отлично. Что мне делать не разрешено? Есть ли способ, чтобы 2 проекта использовали один и тот же сервис @Transactional?

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Ух ты, понял это.Диспетчер сущностей был закрыт, основной поток выдавал ошибку из-за отсутствующего компонента.Я исправил это, и все работает, достаточно кодирования на сегодня!

...