Просто небольшая предыстория. Я новый разработчик, который недавно взял на себя крупный проект после того, как старший разработчик покинул компанию, прежде чем я смог полностью понять, как он это структурировал. Я постараюсь объяснить свою проблему как можно лучше.
Это приложение создает несколько потоков MessageListner для чтения объектов из очередей JMS. Как только объект получен, данные манипулируются на основе некоторой бизнес-логики, а затем сопоставляются с объектом сохранения для сохранения в базе данных оракула с использованием спящего режима EntityManager.
Еще несколько недель назад не было никаких серьезных проблем с этой конфигурацией за последний год или около того с тех пор, как я присоединился к проекту. Но для одной из очередей (проблема изолирована для этой конкретной очереди) управляемый компонент spring, который обрабатывает полученный объект, зависает в методе ниже. Моя отладка привела меня к выводу, что он выполнил все в методе, но зависает после завершения. После нескольких недель попыток решить эту проблему я в конце концов с этой проблемой. Любая помощь в этом будет принята с благодарностью.
Поскольку каждый MessageListner получает свой собственный процессор, этот метод зависания влияет только на входящие данные в одной очереди.
@Transactional(propagation = Propagation.REQUIRES_NEW , timeout = 180)
public void update(UserRelatedData userData, User user,Company company,...)
{
...
....
//business logic performed on user object
....
......
entityMgr.persist(user);
//business logic performed on userData object
...
....
entityMgr.persist(userData);
...
....
entityMgr.flush();
}
Я вставил операторы отладки только для того, чтобы пройтись по методу, и он завершает все, включая entityMgr.flush.().