我在我的應用程序(運行於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, '&'))" />
</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)意味着沒有一個。
有關問題出現的地方的任何建議都將非常感謝,希望有一些顯而易見的東西我錯過了。
我設置會話超時,最大時間限制和默認的時間限制3600秒,應該有足夠多的時間來執行處理。另外,我在我的本地設置中使用了相同的ML服務器,因此我相當確定問題不在於MarkLogic數據庫。事實上,查看ML日誌,我可以看到在Orbeon日誌中出現「java.net.SocketException:Connection reset」錯誤後,處理繼續進行,它只是不再有連接來發布內容。感謝您的建議,雖然:-) – jonesyface
在這種情況下,我認爲它可以安全地說,它不是服務器端超時。其餘選項是客戶端和防火牆。我已經看到了一些防火牆被配置爲關閉空閒連接的情況。另外http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html可能會有所幫助。 – mblakele