-2

我正在尝试为使用 wso2 esb 编写概念证明。概念证明将依赖于 ESB 拾取放入文件夹的 csv 文件,将详细信息转换为 xml,将它们发布到第 3 方 Web 服务,然后将应包含 pdf 二进制文件的响应转换为pdf 并将其放入文件夹中。

当前的问题是,当我在 wso2 esb 4.5.0 中将文件夹配置为端点时,我发送到该端点的任何文件都会出错。我的配置的精简版本如下定义: -

<proxy name="PDFPoller"
      transports="vfs"
      startOnLoad="true"
      trace="enable"
      statistics="enable">
  <description/>
  <target>
     <inSequence>
        <log level="custom">
           <property name="status" value="PDF Receieved"/>
        </log>
        <log level="full"/>
        <property name="transport.vfs.ReplyFileName"
                  expression="test1.pdf"
                  scope="transport"/>
        <property name="OUT_ONLY" value="true"/>
        <send>
           <endpoint name="FileEpr">
              <address uri="vfs:file:///c:/wso2/processed"/>
           </endpoint>
        </send>
     </inSequence>
  </target>
  <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
  <parameter name="transport.PollInterval">15</parameter>
  <parameter name="transport.vfs.MoveAfterProcess">file:///C:/wso2/output</parameter>
  <parameter name="transport.vfs.FileURI">file:///C:/wso2/PollFolder</parameter>
  <parameter name="transport.vfs.MoveAfterFailure">file:///C:/wso2/Failed</parameter>
  <parameter name="transport.vfs.FileNamePattern">.*.pdf</parameter>
  <parameter name="transport.vfs.ContentType">application/pdf</parameter>
  <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>

我从 ESB 得到的错误如下: -

2012-10-29 09:46:00,642 [-] [Axis2 Task] ERROR VFSTransportSender IO Error while 
org.apache.commons.vfs2.FileSystemException: Could not write to "file:///c:/wso2/processed".
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1440)
    at org.apache.commons.vfs2.provider.DefaultFileContent.getOutputStream(DefaultFileContent.java:462)
    at org.apache.synapse.transport.vfs.VFSTransportSender.populateResponseFile(VFSTransportSender.java:232)
    at org.apache.synapse.transport.vfs.VFSTransportSender.sendMessage(VFSTransportSender.java:173)
    at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
    at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:627)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.FileNotFoundException: c:\wso2\processed (Access is denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
    at org.apache.commons.vfs2.provider.local.LocalFile.doGetOutputStream(LocalFile.java:220)
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1432)
    ... 8 more

我不认为问题是本地文件夹权限问题,因为我已经 a) 手动检查了文件夹的权限,并且 b) ESB 会将我放在“pollfolder”中的文件移动到“输出”或如果我将 transport.vfs.MoveAfterProcess 属性设置为该值,则“已处理”,因此可以写入这两个文件夹。

任何帮助,将不胜感激。

4

1 回答 1

0

你的配置看起来不错。但我怀疑以下部分。

<property name="transport.vfs.ReplyFileName"
                  expression="test1.pdf"
                  scope="transport"/>

您可以尝试不使用该属性。然后它将在“已处理”文件夹中创建一个与输入文件名相同的文件。如果它有效,则按如下方式尝试上述属性。

<property name="transport.vfs.ReplyFileName"
                  value="test1.pdf"
                  scope="transport"/>

如您所见,我已将“表达式”属性替换为“值”。当您想要执行某些操作时,应使用表达式,例如连接两个字符串以构建响应文件名等。

于 2012-10-29T13:47:49.690 回答