Как выполнить транзакцию XA в EJB?
У меня есть MDB, слушая конкретную тему.
Я настроил источник данных XA с jboss...
Я установил постоянство.xml
<persistence-unit name="jpa" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jdbc/BKS_DataSource</jta-data-source>
<class>com.jms.mdb.SampleData</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<!--
<property name="hibernate.format_sql" value="true"/>
-->
</properties>
</persistence-unit>
И всякий раз, когда я получаю что-то, я просто выполняю этот код в MDB
@PersistenceContext
EntityManager em = null;
public void onMessage(Message message) {
try {
LoggingEvent event = (LoggingEvent)((ObjectMessage)message).getObject();
System.out.println("Received something11");
SampleData s= new SampleData();
s.setMessage(event.getLoggerName());
em.persist(s);
System.out.println("Persisted");
//Create.main(null);
} catch (JMSException e) {
e.printStackTrace();
}
}
Поэтому в основном мне нужно выполнить двухфазную транзакцию фиксации... Итак, я хочу знать, что мне нужно сделать для выполнения транзакции XA.... Плюс, я хочу сделать это только на Java EE 5
1 ответ
Решение
Если ваш источник данных настроен как источник данных XA, то все, что вам нужно сделать, это аннотировать MDB с помощью соответствующих аннотаций управления транзакциями:
@MessageDriven
@TransactionManagement(CONTAINER)
@TransactionAttribute(REQUIRED)
public class MyMDB implements MessageListener {
public void onMessage(Message message) {
// Hello, message!
}
}