Принять неудачную транзакцию JPA при вызове через JMS MessageListener - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть код, который работает нормально, но не работает при высокой нагрузке. Не удалось найти причину этого маршрута. Ниже приведен обзор моего варианта использования

  1. Я читаю сообщение из очереди JMS.
  2. Вызов одной конечной точки API REST с полученным сообщением.
  3. Сохранение ответа, полученного от # 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, когда несколько потоков обращаются к нему одновременно?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 апреля 2019

Это исключение возникает, когда вы вызываете вложенные методы / службы, также помеченные как @ Transactional.

Для более подробной информации

...