wso2esb-带payloadFactory和mtom优化的vfs代理读/写二进制文件

wso2esb-带payloadFactory和mtom优化的vfs代理读/写二进制文件,wso2,wso2esb,payload,mtom,vfs,Wso2,Wso2esb,Payload,Mtom,Vfs,场景: <?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>

场景

    <?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>
我有一个vfs代理监控一个扩展名为.pdf的文件夹。 代理将base64binary中的文件内容解析为

<axis2ns#:binary xmlns:axis2ns#="http://ws.apache.org/commons/ns/payload">JVBERi0xLjMKJfbk/N8K...</axis2ns#:binary>
JVBERi0xLjMKJfbk/N8K。。。
#是一个递增的数字,据我所知,我对这件事没有影响。使用payloadFactory,我将有效负载重新格式化为

<datatype:pdf xmlns:datatype="http://mynamespace.org/payload"> instead.
而不是
问题

    <?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>
生成的文件如下所示:

--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--
——mimebounde1f5b2321e28e0a638b52a178d5c7ee40c2f3ae08cd43818
内容类型:应用程序/xop+xml;字符集=UTF-8;type=“text/xml”
内容传输编码:二进制
内容ID:
JVBERi0xLjMKJfbk/N8K。。。
--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
删除
5.
file:///home/user/Development/data/testfiles/init/in
file:///home/user/Development/data/failure
假的
pdf格式
应用程序/八位字节流
移动
file:///home/user/Development/data/failure
上面的代码只是为了简化。实际项目执行以下关键操作:

  • 阅读pdf文件

  • 使用来自不同来源的附加信息聚合soap消息

  • 使用自定义中介处理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.
    
    1美元
    有无
    导致
    信息-AxisEngine[MessageContext:logID=6143bc348d4852f3ffa02dba72391ab0860fe7c27625f167]内容ID为空
    [2015-10-16 08:19:40923]错误-AsyncCallback ContentID为空
    java.lang.RuntimeException:ContentID为null
    即使
    $1 
    有无
    导致
    base64binary为纯文本的文件->无功能pdf。
    
    我不确定是否正确。如果我看一下代理,你似乎想读一个pdf文件,然后把它写到其他地方。因此,您可以使用以下命令来编写文件

    <send>           
      <endpoint>
        <address uri="vfs:file:///home/user/Development/data/testfiles/init/out"/>
      </endpoint>
    </send>
    
    
    
    在ESB内部,每个到达的消息/文件都将转换为soap消息

    问候
    Martin

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

    <format>
               <ns:text xmlns:ns="http://ws.apache.org/commons/ns/payload">$1</ns:text>
            </format>
    
    
    $1
    
    希望有帮助。我猜您将无法打开该文件,因为它的编码错误

    问候 Martin

    来自ws-commons开发人员邮件列表上的帖子,最终将我发送到正确的方向

    问题是,要使此操作正常,OmeElement对象必须具有内容ID或将标志isBinary设置为true。
    这是上的一个属性,从中可以看出,这必须在对象上完成,不能从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>
    
    
    $1
    

    在上面的示例中,base64数据作为传入消息的一部分出现。

    感谢您的回复:)遗憾的是,这不是我要寻找的。上面的代码只是为了简化。实际项目执行以下关键操作:1。阅读pdf 2。使用来自不同来源的附加信息聚合soap消息3。使用自定义中介4操纵pdf内容。写下新的pdf,用于聚合和操作。我想用payloadFactory重新格式化初始正文。但一旦我改变了一件事,信息就不再以合适的格式出现。这甚至适用于上面的简单代码。感谢您的回复!不幸的是,这导致文件中只有base64二进制字符串作为纯文本。我在上面添加了一些组合。我正在努力解决几乎相同的问题。PDF数据是JSON的一部分。该值是base64编码的字符串。我必须把它写进一个真正的二进制PDF文件。我最终得到了相同的“ContentID为null”错误。你找到解决办法了吗?很抱歉我回复晚了!到目前为止,我唯一的解决办法是写一个自己的调解人…谢谢你的回复。我也得到了同样的解决方案。