通过 JMS MessageListener 调用时提交失败的 JPA 事务
Commit failure JPA transaction when invoked through JMS MessageListener
我有一个代码可以正常工作,但在负载高时会失败。无法找到它的路由原因。
以下是我的用例概述
- 我正在读取来自 JMS 队列的消息。
- 使用收到的消息调用一个 REST API 端点。
- 将从 #2 收到的响应保存回我的数据库中。
下面是代码片段
//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);
}
}
当我 运行 在调试模式下或者当消息进入队列的频率不那么频繁时,这工作正常。
But when messages coming in queue are very fast then I get exception
in saveToDb
method as
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
我是不是做错了什么,或者当多个线程同时访问它时 JMS 和 JPA 事务之间存在一些混淆?
提前致谢。
This exception occurs when you invoke nested methods/services also marked as @Transactional.
For more details
我有一个代码可以正常工作,但在负载高时会失败。无法找到它的路由原因。 以下是我的用例概述
- 我正在读取来自 JMS 队列的消息。
- 使用收到的消息调用一个 REST API 端点。
- 将从 #2 收到的响应保存回我的数据库中。
下面是代码片段
//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);
}
}
当我 运行 在调试模式下或者当消息进入队列的频率不那么频繁时,这工作正常。
But when messages coming in queue are very fast then I get exception in
saveToDb
method as
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
我是不是做错了什么,或者当多个线程同时访问它时 JMS 和 JPA 事务之间存在一些混淆?
提前致谢。
This exception occurs when you invoke nested methods/services also marked as @Transactional.
For more details