只是一点背景,我是一名新开发人员,在高级开发人员离开公司后,我最近接手了一个重大项目,我还没有完全了解他是如何构建这个项目的。我会尽力解释我的问题。
此应用程序创建多个 MessageListner 线程以从 JMS 队列中读取对象。一旦接收到对象,数据就会根据某些业务逻辑进行操作,然后映射到持久性对象,以使用休眠的 EntityManager 保存到 oracle 数据库。
直到几周前,自从我加入该项目以来,在过去一年左右的时间里,这种配置还没有出现任何重大问题。但是对于其中一个队列(问题与此特定队列隔离),处理接收到的对象的 spring 托管 bean 在下面的方法中挂起。我的调试使我得出结论,它已完成方法中的所有内容,但在完成时挂起。经过数周的尝试解决此问题后,我对这个问题束手无策。对此的任何帮助将不胜感激。
由于每个 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.() 在内的所有内容。