2015-10-14 69 views
3

方案wso2esb - VFS代理讀/寫的二進制,payloadFactory和MTOM優化

我有一個VFS代理監視的文件夾用於進一步擴展.pdf文件。 代理服務器解析在使用Base64Binary該文件的內容到

<axis2ns#:binary xmlns:axis2ns#="http://ws.apache.org/commons/ns/payload">JVBERi0xLjMKJfbk/N8K...</axis2ns#:binary> 

是一個增量號和據我所知,我沒有對這個母校的影響。

生成的文件看起來像這樣::

--MIMEBoundary_e1f5b2321e28e0a638b52a178d5c7ee40c2f3ae08cd43818 
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml" 
Content-Transfer-Encoding: binary 
Content-ID: <[email protected]> 
<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Body> 
<datatype:pdf xmlns:datatype="http://mynamespace.org/payload"> 
JVBERi0xLjMKJfbk/N8K... 
</datatype:pdf> 
</soapenv:Body> 
</soapenv:Envelope> 
--MIMEBoundary_e1f5b2321e28e0a638b52a178d5c7ee40c2f3ae08cd43818-- 

,而不是一個實際PDF文件與payloadFactory我格式化有效載荷由

<datatype:pdf xmlns:datatype="http://mynamespace.org/payload"> instead. 

問題包圍。有什麼需要改變呢?我很確定它對內容類型或payloadFactory是如此。有沒有辦法指定哪些標籤被視爲有效載荷?我已經嘗試了幾種不同的類型,設置和搜索,但沒有找到解決方案。如果我解釋所產生的消息,則正確的mtom不能按照它應有的工作。不應該有一個

<xop:Include href="..."> 

裏面的結果消息,而不是內聯base64binary?

用於再現簡單代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="VFSVFS" 
     transports="vfs" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
    <property name="OUT_ONLY" value="true"/> 
    <property name="enableMTOM" value="true" scope="axis2" type="STRING"/> 
    <property name="enableSWA" value="false" scope="axis2" type="STRING"/> 
    <property name="transportNonBlocking" 
       value="true" 
       scope="axis2" 
       action="remove"/> 
    <payloadFactory media-type="xml"> 
     <format> 
      <datatype:pdf xmlns:datatype="http://mynamespace.org/payload"> 
       $1 
      </datatype:pdf> 
     </format> 
     <args> 
      <arg evaluator="xml" expression="$body/*[1]"/> 
     </args> 
    </payloadFactory> 
    <property name="messageType" value="application/octet-stream" scope="axis2"/> 
    <property name="transport.vfs.ReplyFileName" expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), 'abc.pdf')" scope="transport"/> 
     <property name="transport.vfs.Streaming" value="true" scope="transport" type="STRING"/> 
    <send> 
     <endpoint xmlns="http://ws.apache.org/ns/synapse" name="FileOut_VFS"> 
      <address uri="vfs:file:///home/user/Development/data/testfiles/init/out" optimize="mtom" /> 
     </endpoint> 
    </send> 
    <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/> 
     </inSequence> 
    </target> 
    <parameter name="transport.vfs.ActionAfterProcess">DELETE</parameter> 
    <parameter name="transport.PollInterval">5</parameter> 
    <parameter name="transport.vfs.FileURI">file:///home/user/Development/data/testfiles/init/in</parameter> 
    <parameter name="transport.vfs.MoveAfterFailure">file:///home/user/Development/data/failure</parameter> 
    <parameter name="transport.vfs.Locking">false</parameter> 
    <parameter name="transport.vfs.FileNamePattern">.*.pdf</parameter> 
    <parameter name="transport.vfs.ContentType">application/octet-stream</parameter> 
    <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter> 
    <parameter name="transport.vfs.FailedRecordsFileDestination">file:///home/user/Development/data/failure</parameter> 
    <description/> 
</proxy> 

上面的代碼只是爲了簡化的目的。在實際項目執行的關鍵操作:

  1. 讀入一個PDF

  2. 總皁消息與來自不同來源的額外信息

  3. 操縱PDF內容具有自定義中介

  4. 寫出來的新的PDF

爲了聚合和操作的目的,我想用payloadFactory重新格式化初始體。但只要我改變一件事情,信息就不再以合適的格式出現。 即使在上面的簡單代碼中也適用。

這裏嘗試了組合的和他們的結果的幾個例子:

<ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> 
WITH OR WITHOUT 
<property name="ContentType" value="application/octet-stream" scope="axis2"/> 
RESULTS IN 
INFO - AxisEngine [MessageContext: logID=6143bc348d4852f3ffa02dba72391ab0860fe7c27625f167] ContentID is null 
[2015-10-16 08:19:40,923] ERROR - AsyncCallback ContentID is null 
java.lang.RuntimeException: ContentID is null 
EVEN WITH <property name="enableMTOM" value="false" scope="axis2" type="STRING"/> 


<ns:text xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:text> 
WITH OR WITHOUT 
<property name="ContentType" value="application/octet-stream" scope="axis2"/> RESULTS IN 
File with base64binary as plain/text in it -> no functioning pdf. 
+0

我正在努力解決幾乎相同的問題。 PDF數據作爲JSON的一部分進入。該值是一個base64編碼的字符串。我必須將其寫入一個實際的二進制PDF文件。而我最終會得到相同的「ContentID爲空」錯誤。你有沒有找到這方面的解決方案? –

+0

對不起,我遲到了!到目前爲止,我唯一的解決方案是寫一個自己的中介... –

+0

感謝您的答覆。我也結束了相同的解決方案。 –

回答

0

不知道如果我得到它的權利。如果我看看代理,看起來您想閱讀pdf並將其寫入其他位置。所以你可以使用以下來編寫文件。

<send>   
    <endpoint> 
    <address uri="vfs:file:///home/user/Development/data/testfiles/init/out"/> 
    </endpoint> 
</send> 

在ESB內部,每個到達的消息/文件都將被轉換爲soap消息。

問候 馬丁

+0

謝謝你的回覆:)不幸的是,這不是我要找的。以上代碼僅用於簡化目的。實際項目執行以下關鍵操作: 1.閱讀pdf 2.將soap消息與各種來源的附加信息彙總在一起 3.使用自定義介體處理pdf內容 4.編寫新的pdf 爲了聚合和操作的目的,我想用payloadFactory重新格式化初始體。但只要我改變一件事情,信息就不再以合適的格式出現。 即使在上面的簡單代碼中也適用。 –

1

我想,你應該格式更改爲以下,因此將被視爲文本。

<format> 
      <ns:text xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:text> 
     </format> 

希望有所幫助。我想你將無法打開該文件,因爲它會有錯誤的編碼。

問候 馬丁

+0

謝謝您的回覆!可悲的是,這導致只有base64binary-string的文件顯示爲純文本/文本。我已經在上面添加了一些組合。 –

0

this後的WS-公開發郵件列表上終於給我在正確的方向。

問題是,要使此工作OMElement對象具有內容ID或具有標誌isBinary設置爲true。
這是OMTextImpl上的一個屬性,從我可以告訴的必須在該對象上完成並且不能從XML有效負載設置。所以最後我不得不添加一個腳本中介來做到這一點。

<payloadFactory media-type="xml"> 
    <format> 
    <ns:binary xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:binary> 
    </format> 
    <args> 
    <arg evaluator="xml" expression="$body/attachments/content"/> 
    </args> 
</payloadFactory> 
<script language="js"> 
<![CDATA[ 
    var binaryNode =  
     mc.getEnvelope().getBody().getFirstElement().getFirstOMChild(); 
    binaryNode.setBinary(true); 
]]> 
</script> 

在上面的示例中,base64數據作爲傳入消息的一部分進入。