1

我正在尝试编写参与全局事务的 JAX-WS 服务的演示。随着时间的推移,我的组织将更多地采用这种模式,我们需要弄清楚它,但我正在苦苦挣扎。

我有一个从客户端调用的 WSDL 服务(它也在一个具有相同配置的 Java EE servlet 中......实际上它是同一个服务器,但我可以看到它正在通过网络向自身调用)。两者都在更新他们的行,然后我抛出一个异常,但服务不会回滚。

我用@Transactional(propagation=Propagation.REQUIRED) 注释了一个调用本地DAO 更新和WSDL 服务客户端的方法。该服务反过来调用另一个方法,也以相同的方式注释,该方法又调用一个 dao 方法来执行另一个数据库更新。

应用程序配置.xml:

<jee:jndi-lookup id="wsdlDataSource" jndi-name="${es.ds.jndi}" />
<bean id="wsdlSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="wsdlDataSource" />
    <property name="packagesToScan" value="com.wsdl" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
            <prop key="hibernate.connection.driver_class">com.ibm.db2.jcc.DB2Driver</prop>
            <prop key="hibernate.bytecode.provider">javassist</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.cache.use_second_level_cache">false</prop>
            <prop key="hibernate.default_schema">k702prdr</prop>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
            <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>
            <prop key="jta.UserTransaction">java:comp/UserTransaction</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.wsdl.db.DBTrans</value>
            <value>com.wsdl.db.UsrTrans</value>
        </list>
    </property>
</bean>
<!-- END Data sources  -->

<!-- BEGIN Hibernate config and dependencies -->
<bean id="transactionManager"
    class="org.springframework.transaction.jta.WebSphereUowTransactionManager" >
</bean>
<tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="true" />

我遵循了一些教程,这些教程让我进入服务视图并添加客户端和服务的 WSTRansaction 策略集和绑定(最初都是从 RAD 向导生成的),然后再次进入管理控制台应用程序->应用程序类型-> Websphere 企业应用程序->我的应用程序->服务提供者/客户端策略集和绑定。在那里,我在父应用程序级别分别将 WSTransaction 添加到客户端和服务(策略继承到端点)。

但归根结底,没有发生回滚。帮助!我错过了什么?我配置错了什么?

(更新) - 我找到了如何在管理控制台中打开 websphere 事务跟踪日志。它说(为简洁而编辑):

No transaction context found
Exit
Entry parm0=Operation: isAlive
No transaction context from incoming request
getTransactionManager parm0=com.ibm.ws.tx.jta.TranManagerSet@306e306e

这些消息伴随着一堆似乎是对物体的检查,而且它们重复了很多次。好的,所以我似乎没有从我的客户发送事务上下文。但我还是不明白为什么。任何人?

(更新 2) - 我发现我的服务和客户端的 WSTRansaction 策略集未设置为共享,因此我将其设置为通过 wsdl 共享,现在跟踪日志似乎表明它正在查找事务上下文。 .或者至少,它不再明确地说它不能像上面那样。它在说一些类似以下的东西,可能或可能不是我认为的意思(再次,为简洁起见,如果您没有看到有意义的东西,请告诉我,那里有更多信息):

Entry parm0=XATransactionWrapper@ 5f175f17  XAResource: com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@5b7d5b7d  enlisted: falseHas Tran Rolled Back = false  mcWrapper.hashCode()490085686 parm1=XARESOURCE_NOTASSOCIATED
xa_start with flag: 0=TMNOFLAGS
setResourceStatus parm0=from NONE to REGISTERED
[at this point I see a log stmt that indicates my first update in the service]
setResourceStatus parm0=from REGISTERED to COMPLETING_ONE_PHASE
**setResourceStatus parm0=from COMPLETING_ONE_PHASE to COMMITTED**
setResourceStatus parm0=from NONE to REGISTERED
[at this point I see a log stmt that indicates my second update, which is done in the client]
setResourceStatus parm0=from REGISTERED to COMPLETING
setResourceStatus parm0=from COMPLETING to ROLLEDBACK
[at this point I see the stack trace of the hardcoded exception I am throwing]

所以看起来很清楚,虽然事务管理器现在看到了客户端和服务事务,但它认为应该在服务端完成该部分后立即完成事务,而没有意识到它应该继续。我猜我不知何故触发了过早的提交。想法?

4

0 回答 0