方案: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>
上面的代碼只是爲了簡化的目的。在實際項目執行的關鍵操作:
讀入一個PDF
總皁消息與來自不同來源的額外信息
操縱PDF內容具有自定義中介
寫出來的新的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.
我正在努力解決幾乎相同的問題。 PDF數據作爲JSON的一部分進入。該值是一個base64編碼的字符串。我必須將其寫入一個實際的二進制PDF文件。而我最終會得到相同的「ContentID爲空」錯誤。你有沒有找到這方面的解決方案? –
對不起,我遲到了!到目前爲止,我唯一的解決方案是寫一個自己的中介... –
感謝您的答覆。我也結束了相同的解決方案。 –