我有一个工作正常但在负载很高时失败的代码。无法找到它的路由原因。以下是我的用例概述
以下是代码段
//Message Listener class which reads the messages from JMS Queue
public class MyListener implements MessageListener {
@Autowired
MyDao myDao;
@Override
public void onMessage(Message message) {
MyResponse resp = callRest(message);
myDao.saveToDb(resp);
}
}
//DAO class which updates my entity
@Component
public class MyDao {
@Autowired
EntityManager entityManager;
@Transactional
public boolean saveToDb(MyResponse resp) {
Query query = entityManager.createQuery("from MyTable mt where mt.id=:id");
query.setParameter("id", myResp.getId());
MyTable myTab = (MyTable) query.getSingleResult();
myTab.setProcessFlag(true);
entityManager.merge(myTab);
}
}
当我在调试模式下运行或者消息进入队列不那么频繁时,这种方法很好。
但是当队列中的消息非常快时,我在
saveToDb
方法中得到异常
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
我在这里做错了什么,或者当多个线程同时访问它时,JMS和JPA事务之间是否存在一些混淆?
提前致谢。
当您调用也标记为@Transactional的嵌套方法/服务时,会发生此异常。