2013-04-11 76 views
0

我需要一個解決問題的方法: 我剛試過了這個例子的WSO2 ESB和它的工作: http://wso2.org/library/articles/2011/01/wso2-esb-example-file-processingWSO2 ESB - XML到MySQL數據庫

但我喜歡用一個XML文件作爲輸入和把它寫入MySQL-DB。 的XML文件看起來是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
    <Name>word</Name> 
    <Surname>processor</Surname> 
    <Phone>12333</Phone> 
</soapenv:Body> 
</soapenv:Envelope> 

如果我把這個變成我的「在」 -folder文件將被移動到「出」 -folder,但沒有數據被寫入到數據庫中。沒有錯誤消息。

我的代理服務:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="FileProxy" transports="vfs" statistics="disable" trace="disable" startOnLoad="true"> 
    <target> 
     <inSequence> 
     <log level="full"/> 
     <clone> 
      <target sequence="fileWriteSequence"/> 
      <target sequence="databaseSequence"/> 
     </clone> 
     </inSequence> 
    </target> 
    <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter> 
    <parameter name="transport.PollInterval">15</parameter> 
    <parameter name="transport.vfs.MoveAfterProcess">C:/wso2esb/testordner/out</parameter> 
    <parameter name="transport.vfs.FileURI">C:/wso2esb/testordner/in</parameter> 
    <parameter name="transport.vfs.MoveAfterFailure">C:/wso2esb/testordner/error</parameter> 
    <parameter name="transport.vfs.FileNamePattern">.*.xml</parameter> 
    <parameter name="transport.vfs.ContentType">text/xml</parameter> 
    <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter> 
    <description></description> 
</proxy> 

我的順序:

<?xml version="1.0" encoding="UTF-8"?> 
<sequence xmlns="http://ws.apache.org/ns/synapse" 
      name="databaseSequence" 
      trace="enable" 
      statistics="enable"> 
    <log level="full"> 
     <property name="sequence" value="before-smooks"/> 
    </log> 
    <smooks config-key="smooks"> 
     <input type="xml"/> 
     <output type="xml"/> 
    </smooks> 
    <log level="full"> 
     <property name="sequence" value="after-smooks"/> 
    </log> 
    <log level="full"> 
     <property xmlns:ns="http://org.apache.synapse/xsd" 
       name="name" 
       expression="//csv-record/name/text()"/> 
     <property xmlns:ns="http://org.apache.synapse/xsd" 
       name="surname" 
       expression="//csv-record/surname/text()"/> 
     <property name="phone" value="//csv-record/phone/text()"/> 
    </log> 
    <iterate xmlns:ns2="http://org.apache.synapse/xsd" 
      xmlns:ns="http://org.apache.synapse/xsd" 
      xmlns:sec="http://secservice.samples.esb.wso2.org" 
      expression="//csv-set/csv-record"> 
     <target> 
     <sequence> 
      <log level="full"> 
       <property name="State" value="Iteration"/> 
      </log> 
      <log level="full" category="DEBUG"/> 
      <dbreport> 
       <connection> 
        <pool> 
        <password>passwort</password> 
        <user>esb</user> 
        <url>jdbc:mysql://localhost:3306/</url> 
        <driver>com.mysql.jdbc.Driver</driver> 
        </pool> 
       </connection> 
       <statement> 
        <sql>insert into info.info (name, surname, phone) values (?, ?, ?)</sql> 
        <parameter expression="//csv-record/name/text()" type="VARCHAR"/> 
        <parameter expression="//csv-record/surname/text()" type="VARCHAR"/> 
        <parameter expression="//csv-record/phone/text()" type="VARCHAR"/> 
       </statement> 
      </dbreport> 
     </sequence> 
     </target> 
    </iterate> 
    <log level="full" category="DEBUG"/> 
</sequence> 

我認爲這將是一個簡單的問題,但我無法得到它... 像我說過,它使用普通的文本文件,但不使用XML。我試過不同的想法,不知道還有什麼我可以嘗試...... 有人知道我的錯誤是什麼?

更新:

日誌從控制檯:

[2013-04-12 09:35:55,687] INFO - DBReportMediator Successfully created data source for jdbc:mysql://localhost:3306/. 
[2013-04-12 09:36:10,170] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid: 
2CBD1753113A1373101365752170177, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope x 
mlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body> 
    <Name>word</Name> 
    <Surname>processor</Surname> 
    <Phone>12333</Phone> 
</soapenv:Body></soapenv:Envelope> 
[2013-04-12 09:36:10,175] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid: 
a9252cd8-fe73-4e85-9f41-0842872d3a73, Direction: request, sequence = before-smooks, Envelope: <?xml version='1.0' encodi 
ng='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body> 
    <Name>word</Name> 
    <Surname>processor</Surname> 
    <Phone>12333</Phone> 
</soapenv:Body></soapenv:Envelope> 
[2013-04-12 09:36:10,178] INFO - LogMediator sequence = fileWriteSequence 
[2013-04-12 09:36:10,246] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid: 
a9252cd8-fe73-4e85-9f41-0842872d3a73, Direction: request, sequence = after-smooks, Envelope: <?xml version='1.0' encodin 
g='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><csv-set/></soapenv 
:Body></soapenv:Envelope> 
[2013-04-12 09:36:10,249] INFO - LogMediator To: , WSAction: urn:mediate, SOAPAction: urn:mediate, MessageID: urn:uuid: 
a9252cd8-fe73-4e85-9f41-0842872d3a73, Direction: request, name = , surname = , phone = //csv-record/phone/text(), Envelo 
pe: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><s 
oapenv:Body><csv-set/></soapenv:Body></soapenv:Envelope> 
[2013-04-12 09:36:11,254] WARN - TimeoutHandler Expiring message ID : urn:uuid:4c422f4e-aed5-4eaa-ad9b-e5407db20562; dr 
opping message after global timeout of : 120 seconds 

的fileWriteSequence看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<sequence xmlns="http://ws.apache.org/ns/synapse" 
      name="fileWriteSequence" 
      trace="enable" 
      statistics="enable"> 
    <log level="custom"> 
     <property name="sequence" value="fileWriteSequence"/> 
    </log> 
    <property xmlns:ns2="http://org.apache.synapse/xsd" 
      xmlns:ns="http://org.apache.synapse/xsd" 
      name="transport.vfs.ReplyFileName" 
      expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.xml')" 
      scope="transport" 
      type="STRING"/> 
    <property name="OUT_ONLY" value="true" scope="default" type="STRING"/> 
    <send> 
     <endpoint name="FileEpr"> 
     <address uri="vfs:C:/wso2esb/testordner/out"/> 
     </endpoint> 
    </send> 
</sequence> 

的Smooks配置:

<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd"> 

    <!--Configure the CSVParser to parse the message into a stream of SAX events. --> 
    <resource-config selector="org.xml.sax.driver"> 
    <resource>org.milyn.csv.CSVParser</resource> 
    <param name="fields" type="string-list">name,surname,phone</param> 
    </resource-config> 

</smooks-resource-list> 

我也改了代碼數據庫序列如上。

謝謝。

回答

0

您的代理服務看起來不錯。但我沒什麼顧慮。

  1. 你爲什麼要把sql查詢作爲CDATA。請參閱樣本here
  2. 您還沒有在連接url中提到數據庫名稱。可能它不是一個問題,因爲你已經在sql查詢中使用了database.table格式。
  3. 修復之後,如果問題仍然存在,請使用1和2,然後嘗試僅使用一個序列的代理。即暫時避免文件寫入序列,並僅使用dbwrite序列進行嘗試。

您還可以記錄您要在DBReport介體之前插入的條目。即在smooks中介之後,放置一個日誌中介並記錄名字,姓氏和電話。這將確保您試圖插入從消息中正確提取的值。

+0

我試過了。 sql查詢被作爲CDATA的esb,我只在設計視圖中寫入語句。對於我使用database.table格式的數據庫,就像你期望的那樣。我也嘗試只使用一個序列並改變序列的順序。但沒有任何幫助。我會在我的問題中添加一些代碼。在數據庫序列中,我添加了一個日誌中介,但我不確定它是否正確。也許問題是smooks中介? – muetze 2013-04-12 07:38:40

+0

是的。似乎問題是與smooks配置。在smooks介體打印一個空的csv-set後,您已經記錄了日誌條目。我認爲問題在於,你提供了一個xml文件作爲輸入,但是你已經以它期望的csv文件的方式配置了smooks。您將不得不搜索如何配置smooks以用於xml輸入文件。 – 2013-04-13 16:24:28