如何在EJB中执行XA事务?

3

我有一个监听特定主题的 MDB。

我已经配置了带有 JBoss 的 XA 数据源...

我已经设置了 persistance.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个回答

1

如果您的数据源配置为XA数据源,那么您只需要使用适当的事务管理注解来注释您的MDB:

@MessageDriven
@TransactionManagement(CONTAINER)
@TransactionAttribute(REQUIRED)
public class MyMDB implements MessageListener {

 public void onMessage(Message message) {
   // Hello, message!
 }

}

非常感谢您的回答。我只是好奇它如何处理回滚? - user796666
你是指如何回滚事务还是回滚时会发生什么? - Behrang
当回滚发生时会发生什么?是否有可能控制回滚? - user796666
当事务被回滚时,传入的消息也会被回滚到MDB的目标(队列/主题)中。运行时异常会回滚事务。要使已检查异常回滚事务,您应该使用“ApplicationException”进行注释,并将“rollback”设置为“true”。 - Behrang
要显式回滚事务,您可以使用MessageDrivenContextsetRollbackOnly方法。 - Behrang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接