2015-12-17 8 views
1

Я должен реализовать пул соединений jdbc, который поддерживает транзакцию XA в моем потоке мула. Используя пружины, я использовал источник данных, как показано ниже:Как реализовать поддержку соединения XA в пуле соединений tomcat с использованием пружин?

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:core="http://www.mulesoft.org/schema/mule/core" 
    xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" 
    xmlns:jbossts="http://www.mulesoft.org/schema/mule/jbossts" xmlns:vm="http://www.mulesoft.org/schema/mule/vm" 
    xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" 
    xmlns:jdbc-ee="http://www.mulesoft.org/schema/mule/ee/jdbc" xmlns="http://www.mulesoft.org/schema/mule/core" 
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd 
http://www.mulesoft.org/schema/mule/ee/jdbc http://www.mulesoft.org/schema/mule/ee/jdbc/current/mule-jdbc-ee.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd 
http://www.mulesoft.org/schema/mule/jbossts http://www.mulesoft.org/schema/mule/jbossts/current/mule-jbossts.xsd 
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd"> 

    <spring:beans> 
     <spring:bean id="MySQL_Pooled_Data_Source" class="org.apache.tomcat.jdbc.pool.XADataSource" 
      name="Bean"> 
      <spring:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
      <spring:property name="url" 
       value="jdbc:mysql://10.213.32.13:3306/DB_NE60BMRS_REP" /> 
      <spring:property name="username" value="Tester249" /> 
      <spring:property name="password" value="Tester249" /> 
      <spring:property name="maxActive" value="100" /> 
      <spring:property name="minIdle" value="10" /> 
      <spring:property name="initialSize" value="5" /> 
     </spring:bean> 
    </spring:beans> 

    <jdbc-ee:connector name="Reporting_Database" 
     dataSource-ref="MySQL_Pooled_Data_Source" validateConnections="true" 
     queryTimeout="-1" pollingFrequency="0" doc:name="Database"> 
     <reconnect blocking="false" frequency="10000" count="3"></reconnect> 
    </jdbc-ee:connector> 
    <vm:connector name="VM_Connector" validateConnections="true" 
     doc:name="VM_Connector" createMultipleTransactedReceivers="true" 
     numberOfConcurrentTransactedReceivers="4"> 
    </vm:connector> 

    <flow name="ApiKeyLoadImplFlow" doc:name="ApiKeyLoadImplFlow" 
     initialState="started"> 

     <vm:inbound-endpoint exchange-pattern="request-response" 
      doc:name="Impl_ApiKeyLoad_Req" path="ImplApiKeyLoadReq" 
      connector-ref="VM_Connector" responseTimeout="${vm.response.timeout}"> 
      <xa-transaction action="BEGIN_OR_JOIN" /> 
     </vm:inbound-endpoint> 
     <logger message="Start of Api Key Load Implementation" level="DEBUG" 
      doc:name="ENTRY_LOG" /> 
     <set-variable variableName="FlowData" value="#[payload]" 
      doc:name="FlowData" /> 
     <set-variable variableName="#['UserId']" value="#[payload.getUserID()]" 
      doc:name="UserID" /> 

      <jdbc-ee:outbound-endpoint exchange-pattern="request-response" 
      queryKey="checkdata" queryTimeout="-1" connector-ref="Reporting_Database" 
      doc:name="Check_Value_Exists"> 
      <xa-transaction action="JOIN_IF_POSSIBLE" /> 
      <jdbc-ee:query key="checkdata" 
       value="${ftp.db.t_bmrs_api_keys.checkdata.query}" /> 

     </jdbc-ee:outbound-endpoint> 

     <logger message="End of Api Key Load Implementation" level="DEBUG" 
      doc:name="EXIT_LOG" /> 


     <catch-exception-strategy doc:name="Catch Exception Strategy"> 
      <logger level="WARN" doc:name="Exception_Log" 
       message="Exception in ApiKeyLoadImplFlow #[System.getProperty('line.separator')] Error Description = #[exception.getMessage()]" /> 

     </catch-exception-strategy> 
    </flow> 
</mule> 

Но я столкнулся с нижеследующими исключениями. как реализовать XAconnection поддержка для объединения с использованием пружин?

ERROR 2015-12-17 15:51:37,626 [[apikey_load_phase3].Mule.02] org.mule.retry.notifiers.ConnectNotifier: Failed to connect/reconnect: EEJdbcConnector 
{ 
    name=Reporting_Database 
    lifecycle=initialise 
    this=15db0f5 
    numberOfConcurrentTransactedReceivers=4 
    createMultipleTransactedReceivers=false 
    connected=false 
    supportedProtocols=[jdbc] 
    serviceOverrides=<none> 
} 
*Root Exception was: Connection from pool does not implement javax.sql.XAConnection(SQL Code: 0, SQL State: + null). Type: class java.sql.SQLException* 
+0

Я думаю, что и нужно TomEE для этого. Я понимаю, что транзакции XA относятся к базам данных (или что-то еще). Поэтому, если у меня есть Sybase и Oracle, и я хочу делать некоторые действия как в одной транзакции. Также я понимаю, что это то, что вы делаете на полном сервере приложений JEE, а не только в контейнере. – user447607

ответ

1

Вы должны заменить:

com.mysql.jdbc.Driver 

с:

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 
+0

Я выполнил как ниже замену com.mysql.jdbc.Driver с com.mysql.jdbc.jdbc2.optional.MysqlXADataSource –

+0

\t \t \t <пружина: свойство имя =" «значение = "maxActive 50"/> \t \t \t <пружина: свойство имя = "" значение = "minIdle 100"/> \t \t \t <пружина: свойство имя = значение "initialSize" = "10" /> \t \t \t <пружина: имя свойства = "DataSource" исх = "MySQL_XA_Data_Source" /> \t \t

+0

Но теперь я столкнулся с проблемой ниже –