Управляемые Bean исключения MDB и базы данных

У меня есть управляемый Бином MDB -InvoiceInquiryMessageBean со следующим определением, которое вызывает CMT - InvoiceManager, который выполняет операции с базой данных.

MDB явно упоминается как управляемый компонент, а onMessage() имеет транзакцию NOT_SUPPORTED. Поэтому этот MDB работает без разграничения транзакций.

В приведенном ниже компоненте InvoiceManager не определен тип транзакции или атрибут транзакции. поэтому по умолчанию это CMT, управляемый контейнером, и по умолчанию имеет тип транзакции REQUIRED. Этот компонент выполняет операции с базой данных. Вопросы

Вопрос 1

Если есть какие-либо ошибки / исключения во время выполнения операций с БД, например (первичный ключ нарушен, тупик БД, например, SQL-код ошибки 1205), транзакция БД считается неудачной. Будет ли эта ошибка транзакции БД влиять на вызывающий MDB.

Причина этого вопроса в том, что я вижу, что сообщения доставляются в MDB иногда во время исключений из базы данных. Несмотря на то, что MDB определен как не участвующий в какой-либо транзакции, управляемой контейнером, проблема БД связана с транзакцией базы данных, и это приведет к тому, что сообщение будет доставлено в MDB.

Пожалуйста, если мой вопрос не ясен, дайте мне знать.

@TransactionManagement(TransactionManagementType.BEAN)
@MessageDriven(name = "NonPersistentInquiryMessageBean", activationConfig = {      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")    })
public class InvoiceInquiryMessageBean implements MessageListener
{
      @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
      public void onMessage(Message msg)
      {
          call a CMT Bean(CMT_DB_Bean) which performs database operations
      }
}

CMT  Bean

@Stateless
public class InvoiceManager implements InvoiceManager Local {
entityManager.update();

}  

1 ответ

Причина этого вопроса в том, что я вижу, что сообщения доставляются в MDB иногда во время исключений из базы данных.

Я думаю, что ваша проблема связана с обработкой исключений, а не с разграничением транзакций. Тот факт, что и MDB, и сессионный компонент выполняются в разных транзакциях, не означает, что они изолированы от распространения исключений.

Когда ваш сессионный компонент генерирует исключение, он распространяется на клиента (в этом случае InvoiceInquiryMessageBean). Если ваш MDB не обрабатывает его, Контейнер не подтвердит сообщение, поэтому оно будет доставлено.

Одним из возможных решений является обработка исключения в MDB.

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  public void onMessage(Message msg)
  {
try { 
      call a CMT Bean(CMT_DB_Bean) which performs database operations
} catch (Exception e) {
 //log  
}
  }