У меня есть код, который работает нормально, но не работает при высокой нагрузке. Не удалось найти причину этого маршрута.
Ниже приведен обзор моего варианта использования
- Я читаю сообщение из очереди JMS.
- Вызов одной конечной точки API REST с полученным сообщением.
- Сохранение ответа, полученного от # 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);
}
}
Это прекрасно работает, когда я работаю в режиме отладки или когда сообщения приходят в очередь не так часто.
Но когда сообщения приходят в очередь очень быстро, я получаю исключение
в saveToDb
метод как
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
Я что-то здесь не так делаю или есть некоторая путаница между транзакциями JMS и JPA, когда несколько потоков обращаются к нему одновременно?
Заранее спасибо.