2012-01-23 19 views
2

私はWebsphereの内部で動作するアプリケーションを持っており、永続的なJPAエンティティに問題があります。Spring、Websphere、JMSおよびEclipselink Issue

以前は、アプリケーションはRESOURCE_LOCAL永続ユニット、Spring JpaTransactionManager、およびコードで明示的にコミットされたトランザクションで設定されていました。

TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition()); 
    try { 
    entityManager.persist(someJpaEntity); 
    } 
    catch(Exception exception) { 
    transactionManager.rollback(transactionStatus); 
    throw exception; 
    } 
    try { 
    transactionManager.commit(transactionStatus); 
    } 
    catch(TransactionException exception) { 
    exception 
    } 

私は、WebSphereキューにリンクされているメッセージドリブンPOJOを通じて呼び出しを許可するアプリケーションの機能強化に取り組んでいます。私はアプリケーションがJMSキューを介してメッセージを受信できるようにする春からの設定をセットアップすることができました。

<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="QueueConnectionFactory"/> 
<jee:jndi-lookup id="jmsQueue" jndi-name="DIQueue" /> 

<!-- A dynamic resolver --> 
<bean id="jmsDestResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver"/> 

<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory"> 
     <ref bean="jmsConnectionFactory"/> 
    </property> 
    <property name="destinationResolver"> 
     <ref bean="jmsDestResolver"/> 
    </property> 
</bean> 

<bean id="messageListener" class="my.app.FileMessageListener" /> 

<bean id="exListener" class="my.app.JmsExceptionListener" /> 

<bean id="msgListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    <property name="destination" ref="jmsQueue" /> 
    <property name="messageListener" ref="messageListener" /> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="taskExecutor" ref="myTaskExecutor" /> 
    <property name="exceptionListener" ref="exListener" /> 
</bean> 

<bean id="myTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
    <property name="workManagerName" value="wm/default" /> 
</bean> 

ないが、私の春のセットアップに問題があるが、一部には、私はとの良好なように見えるように私は、私のActive MQブローカーを介してメッセージを受信しなければわから:春の設定は次のようになります。

ここで問題は、JMSを介してメッセージを受け取ったときに、上記のコードを呼び出してJPAエンティティを挿入することです。コードが実行されると、「2フェーズトランザクションで1フェーズリソースをコミットできません」というメッセージが表示されます。私が理解しなければならないのは、Spring JpaTransactionManagerがXAまたはJTAトランザクションで動作しないということです。

私はSpring JtaTransactionManagerに移りました。

私はトランザクションマネージャを宣言するのはここで、私はJTAを使用するには、オーバーを考えることができるすべてを変更:

私の永続化XML更新
<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/> 

<persistence-unit name="AppUnit" transaction-type="JTA">   
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> 
    <jta-data-source>java:APPDS</jta-data-source> 

そして、まだ、何も動作します。私のコードは例外なく実行されますが、データベースに永続化されるものはありません。メッセージはJMSキューから取り出されますが、データは取得されません。

提案がありますか?

答えて

1

私はついにこの作業をして、答えを投稿すると考えました。

パズルには実際に2つの部分があります。

まず、Websphereでは、アプリケーションサーバー→TransactionServiceに移動し、「ヒューリスティックなハザードを受け入れる」チェックボックスをオンまたはオフにする必要があります。それは間違いなく助けになりました。私はWAS 7を実行しています。

2番目の点は、永続性ユニットまたはEntityManagerFactoryでプロパティeclipselink.target-serverを設定する必要があることです。

この2番目の項目は間違いなくトリックでした。私はその不動産を使ってテストしました。それがなければ、何も存続しない。それで、すべてうまく動作します。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="MyUnit" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="databasePlatform">   
       <value>${app.databasePlatform}</value> 
      </property> 
      <property name="showSql"> 
       <value>${app.showSql}</value> 
      </property>    
     </bean> 
    </property> 

<!-- THIS DID THE TRICK --> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="eclipselink.target-server" value="${app.targetServer}"/> 
     </map> 
    </property>  
</bean> 
:ここ

は私がeclipselink.target-サーバープロパティの値を設定するプロパティのプレースホルダを使用しています、私のEntityManagerFactoryです

関連する問題