2014-01-27 32 views
3

我在我的應用程序(運行於Tomcat v6)中使用Orbeon管道作爲中間層,其中涉及將XML內容發佈到MarkLogic數據庫在後端。除了向MarkLogic發佈大量內容(5 + MB)的情況之外,這通常運行良好,然後在對修改後的結果文檔作出響應之前處理該內容;這是一個可能需要10分鐘以上的過程。使用Orbeon xforms提交將內容發佈到MarkLogic時出現「java.net.SocketException:Connection reset」錯誤

我發現當我用本地安裝的Orbeon/Tomcat與外部MarkLogic服務器通信時運行此大型XML文件的過程時,它工作正常。但是,當我在與同一個MarkLogic服務器通信的Orbeon/Tomcat的基於服務器的安裝上運行它時,在MarkLogic服務器有機會響應之前,在日誌中出現「java.net.SocketException:Connection reset」錯誤更新到Orbeon的XML內容。基於服務器的安裝(據我所知)具有與本地安裝相同的設置。

這種重置似乎在首次提交給MarkLogic並打開連接的5分鐘時間之後發生。

對於需要較少時間讓MarkLogic處理和響應Orbeon的較小文件,這不是問題。

執行這份提交給MarkLogic看起來像下面的Orbeon管道代碼:

<p:processor name="oxf:xslt"> 
    <p:input name="data" href="#document" /> 
    <p:input name="config"> 
     <xforms:submission xsl:version="2.0" method="post" xxforms:username="$USERNAME" xxforms:password="$PASSWORD"> 
      <xsl:variable name="parameters" as="xs:string*"> 
       <xsl:value-of select="concat('modifiedTime=', doc('input:documentDate')/an:element)" /> 
       <xsl:value-of select="concat('generate-effect-id=', 
        if (doc('input:review') = 'review') then 'true' 
        else (
         if (doc('input:documentDate')/an:element[@an:attribute = 'some value']) then 'false' 
         else 'true' 
        ) 
       )" /> 
      </xsl:variable> 
      <xsl:attribute name="action" select="concat('http://db:$DBPORT/queries/some-query.xq?', string-join($parameters, '&amp;'))" /> 
     </xforms:submission> 
    </p:input> 
    <p:input name="review" href="#instance#xpointer(/parameters/review)" /> 
    <p:input name="documentDate" href="#documentXML" /> 
    <p:output name="data" id="submission" /> 
</p:processor> 
<p:processor name="oxf:xforms-submission"> 
    <p:input name="submission" href="#submission" /> 
    <p:input name="request" href="#inputDoc" /> 
    <p:output name="response" id="outputDoc" /> 
</p:processor> 

和Java堆棧錯誤消息我在Orbeon日誌得到如下開頭:

ERROR XFormsServer - xforms-submit-error - setting throwable {throwable: "java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:168) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78) 
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106) 
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116) 
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413) [...] 

我已經將MarkLogic和Apache(這是所使用的服務器)的默認超時設置爲30分鐘,所以我非常確定這不是問題(並且這些都與本地和服務器設置相匹配)並且沒有超時已經爲Orbeon設置了,根據文檔(https://doc.orbeon.com/configuration/properties/general.html#socket-timeout)意味着沒有一個。

有關問題出現的地方的任何建議都將非常感謝,希望有一些顯而易見的東西我錯過了。

回答

0

MarkLogic請求是否超時?請求超時由HTTPServer「默認時間限制」設置決定,默認時間爲600秒。所以需要超過600秒的請求將會以XDMP-EXTIME之類的方式超時。如果您的HTTPServer配置爲記錄錯誤,您可以檢查錯誤日誌。或者只是嘗試增加,再說到1200或1800

文檔:

+0

我設置會話超時,最大時間限制和默認的時間限制3600秒,應該有足夠多的時間來執行處理。另外,我在我的本地設置中使用了相同的ML服務器,因此我相當確定問題不在於MarkLogic數據庫。事實上,查看ML日誌,我可以看到在Orbeon日誌中出現「java.net.SocketException:Connection reset」錯誤後,處理繼續進行,它只是不再有連接來發布內容。感謝您的建議,雖然:-) – jonesyface

+0

在這種情況下,我認爲它可以安全地說,它不是服務器端超時。其餘選項是客戶端和防火牆。我已經看到了一些防火牆被配置爲關閉空閒連接的情況。另外http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html可能會有所幫助。 – mblakele

相關問題