【发布时间】:2013-09-02 14:40:40
【问题描述】:
我正在尝试编写一个 Mule ESB 应用程序,它将 XML 文件读入域对象,然后使用 JPA 将该对象写入 MySQL 数据库。
我已经找到了大部分需要的配置,但我遇到了一个问题,即 Mule JPA 模块 (https://github.com/mulesoft/mule-module-jpa) 似乎没有提交 sql 查询。我已将 Mule JPA 组件设置为刷新查询,我可以看到它们被写入 MySQL 常规日志,但从未完成 COMMIT,因此从未存储数据。似乎从未调用模块中 JPATransaction 类的 doCommit() 方法,我看不到它的任何日志输出。但是,事务似乎是使用同一类的 bindResource 方法绑定的。这可以在日志中看到。
知道我在这里做错了什么吗?
骡流:
<spring:beans>
<spring:bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<spring:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<spring:property name="url" value="jdbc:mysql://localhost:3306/interoperability_layer?user=root&password=***" />
<spring:property name="defaultAutoCommit" value="true" />
</spring:bean>
<spring:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<spring:property name="entityManagerFactory" ref="entityManagerFactory"/>
</spring:bean>
<spring:bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
<spring:bean id="eclipseLinkVendor" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<spring:property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform"/>
<spring:property name="generateDdl" value="false"/>
<spring:property name="showSql" value="false"/>
</spring:bean>
<spring:bean id="entityManagerFactory" name="Bean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<spring:property name="dataSource" ref="dataSource" />
<spring:property name="persistenceUnitName" value="org.jembi.openhim.jpa" />
<spring:property name="jpaDialect" ref="jpaDialect" />
<spring:property name="jpaVendorAdapter" ref="eclipseLinkVendor" />
<spring:property name="packagesToScan" value="domain"/>
</spring:bean>
</spring:beans>
<jpa:config name="Java_Persistence_API" entityManagerFactory-ref="entityManagerFactory" doc:name="Java Persistence API"/>
<flow name="openhim-report-adapterFlow1" doc:name="openhim-report-adapterFlow1">
<vm:inbound-endpoint exchange-pattern="request-response" path="processReport" doc:name="VM">
</vm:inbound-endpoint>
<component class="org.jembi.openhim.IndicatorReportXmlToObjectTransformer" doc:name="Store indicator reports"/>
<logger message="Converted XML to Report object" level="INFO" doc:name="Logger"/>
<transactional action="ALWAYS_BEGIN" doc:name="Transactional">
<jpa:persist config-ref="Java_Persistence_API" entity-ref="#[payload:]" doc:name="Java Persistence API" flush="true"/>
</transactional>
<logger message="Saved Report object using JPA" level="INFO" doc:name="Logger"/>
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[message.payload = "";]]></scripting:script>
</scripting:component>
<http:response-builder status="201" doc:name="HTTP Response Builder" contentType="application/xml"/>
<logger message="Sending HTTP responce" level="INFO" doc:name="Logger"/>
</flow>
日志输出:
INFO 2013-09-02 16:17:21,601 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Converted XML to Report object
DEBUG 2013-09-02 16:17:21,633 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.module.jpa.adapters.JPAModuleProcessAdapter: Persisting: org.jembi.openhim.Report@1749c7ac
DEBUG 2013-09-02 16:17:21,634 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.module.jpa.adapters.JPAModuleProcessAdapter: Executing JPA command with message: org.jembi.openhim.Report@1749c7ac, command: org.mule.module.jpa.command.Persist@6bf22341 and parameters: null
[EL Info]: 2013-09-02 16:17:21.663--ServerSession(1208128432)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2013-09-02 16:17:21.964--ServerSession(1208128432)--file:/home/ryan/MuleStudio/workspace/.mule/apps/openhim-report-adapter/classes_org.jembi.openhim.jpa login successful
DEBUG 2013-09-02 16:17:22,030 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.module.jpa.JPATransaction: Binding JPA transaction: 621071ed-13da-11e3-a4cd-0907619c09d6
DEBUG 2013-09-02 16:17:22,043 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.module.jpa.JPATransaction: Binding org.eclipse.persistence.internal.jpa.EntityManagerImpl@2eabef26 to org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@19e1bfba
DEBUG 2013-09-02 16:17:22,044 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.module.jpa.command.Persist: Persisting entity: org.jembi.openhim.Report@1749c7ac
INFO 2013-09-02 16:17:22,134 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Saved Report object using JPA
INFO 2013-09-02 16:17:22,286 [[openhim-report-adapter].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: Sending HTTP responce
DEBUG 2013-09-02 16:17:22,289 [[openhim-report-adapter].connector.http.mule.default.receiver.02] com.mulesoft.mule.config.pool.MonitoredThreadPoolExecutor: Stats{totalTime=979.67, startTime=25637681310485, endTime=25638660979198}
DEBUG 2013-09-02 16:17:22,289 [[openhim-report-adapter].connector.http.mule.default.receiver.02] com.mulesoft.mule.config.pool.MonitoredThreadPoolExecutor: Finished Work: org.mule.execution.FlowProcessingPhase$1@7a670f8b. in Thread[[openhim-report-adapter].connector.http.mule.default.receiver.02,5,main]. Active tasks: 1 (2 threads in a pool)
DEBUG 2013-09-02 16:17:22,290 [[openhim-report-adapter].http.request.dispatch.8085.01] com.mulesoft.mule.config.pool.MonitoredThreadPoolExecutor: Stats{totalTime=1007.19, startTime=25637654077832, endTime=25638661269425}
DEBUG 2013-09-02 16:17:22,290 [[openhim-report-adapter].http.request.dispatch.8085.01] com.mulesoft.mule.config.pool.MonitoredThreadPoolExecutor: Finished org.mule.transport.http.HttpRequestDispatcherWork@b6edc37. in Thread[[openhim-report-adapter].http.request.dispatch.8085.01,5,main]. Active tasks: 0 (1 threads in a pool)
更新
这是我的 persistence.xml 文件:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="org.jembi.openhim.jpa" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.jembi.openhim.Report</class>
<class>org.jembi.openhim.Indicator</class>
<class>org.jembi.openhim.DataElements</class>
<properties>
<property name="eclipselink.weaving" value="false"/>
</properties>
</persistence-unit>
</persistence>
【问题讨论】:
-
我不熟悉 Spring,所以我不知道工作流程——但是,你一针见血,EntityManager.getTransaction().commit();没有被调用。如果代码期望在未正确配置时对事物进行容器管理,则这种情况经常发生在 EE 方面。 Spring 如何以及何时导致提交?你需要在那里寻找答案。
org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect类可能也有很多有用的信息。在这种情况下,我猜 ->EclipseLinkJpaDialect.JpaDialect.cleanupTransaction(obj). -
也可以很简单:`
` -
@DanielChapman 谢谢,我试过 RESOURCE_LOCAL 没有成功。似乎 Mule 模块(mule 使用 spring)在应该提交事务时没有提交事务,但我不明白为什么不提交。
-
RESOURCE_LOCAL 意味着您正在自己处理事务。我的猜测是它需要“容器管理”。
Dialect.cleanupTransaction(ObjecT)(调试它)是应该进行调用的地方。 -
我发现这个模块使用 hibernate 作为 JPA 提供程序存在完全相同的问题。希望 Mulesoft 有一天能尽快解决这个问题。stackoverflow.com/questions/20565583/…
标签: java mysql jpa eclipselink mule