wso2esb - 使用 payloadFactory 和 mtom 优化的 vfs-Proxy 读/写二进制文件

标签 wso2 payload mtom vfs wso2-esb

场景:

我有一个 vfs-Proxy 监控文件夹中扩展名为 .pdf 的文件。 Proxy将base64binary中的file-content解析为

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

# 是一个递增的数字,据我所知,我对这件事没有影响。使用 payloadFactory 我重新格式化要被包围的有效负载

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

问题:

生成的文件如下所示:

--MIMEBoundary_e1f5b2321e28e0a638b52a178d5c7ee40c2f3ae08cd43818
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.f1f5b2321e28e0a638b52a178d5c7ee40c2f3ae08cd43818@apache.org>
<?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 相关。有没有办法指定将哪些标签视为有效负载?我已经尝试了几种不同的类型、设置并进行了搜索,但找不到解决方案。如果我解释生成的消息正确 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. 将 soap 消息与来自各种来源的附加信息聚合

  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.

最佳答案

我想,您应该将格式更改为以下格式,以便将其视为文本。

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

希望对您有所帮助。我猜您将无法打开该文件,因为它的编码有误。

问候 马丁

关于wso2esb - 使用 payloadFactory 和 mtom 优化的 vfs-Proxy 读/写二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33126428/

相关文章:

mysql - EMM - 从 H2 迁移到 Mysql

drools - 如何将 Drools Drl 文件与 WSO2 业务规则服务器一起使用

objective-c - 在 Objective-C 中为 POST HTTP 请求生成 JSON 负载

c# - SoapHttpClientProtocol 收到意外的内容类型

java - 将 MTOM 应用于 Web 服务时,WSDL 是否需要进行任何更改?

javascript - WSO2 Jaggery - 如何将数字解析为整数

java - WSO2中如何设置Web APP的访问超时时间?

iphone - 为 APNS 创建 .pem 文件?

h.264 - 使用 RTSP over TCP 通过 h.264 帧传输附加数据

ios - 在 iOS 中使用 MTOM 通过 Soap 消息上传文件