wso2esb - vfs-Proxy读/写二进制文件,带有payloadFactory和mtom-optimization

时间:2015-10-14 13:17:54

标签: wso2 wso2esb payload mtom vfs

方案

我有一个vfs-Proxy监视扩展名为.pdf的文件的文件夹。 代理将base64binary中的文件内容解析为

<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有关。有没有办法指定哪些标签被视为有效负载?我已经尝试了几种不同的类型,设置和搜索,但coudn没有找到解决方案。如果我解释结果消息正确,那么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. 使用自定义中介

  4. 操纵pdf内容
  5. 写出新的pdf

  6. 出于聚合和操作的目的,我想用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.
    

3 个答案:

答案 0 :(得分:1)

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

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

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

此致 马丁

答案 1 :(得分:0)

不确定我是否做对了。如果我查看代理,您似乎想要阅读pdf并将其写入其他位置。所以你只需使用以下内容来编写文件。

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

在ESB内部,到达的每个消息/文件都将转换为soap消息。

此致 马丁

答案 2 :(得分:0)

来自ws-commons-dev邮件列表上的this帖子,最后发送给我正确的方向。

问题是,为了使这项工作,OMElement对象具有Content 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数据作为传入消息的一部分进入。