写入文件的WSO2 Api管理器序列不工作

写入文件的WSO2 Api管理器序列不工作,wso2,wso2esb,wso2-am,Wso2,Wso2esb,Wso2 Am,最近,我们开始研究WSO2 Api管理器,并希望创建一个故障流序列,该序列将有关故障的一些信息写入位于文件系统中的文件中。WSO2 API管理器安装适用于Windows 我按照中的文档步骤启用VFS传输。然后,我按照这个示例创建了一个文件代理和文件写入序列(我跳过了数据库和文件读取器,因为我不需要它们): 首先,我认为这是一个权限问题,但我授予了匿名用户对该位置的完全控制权,并以管理员身份运行WSO2 AM进程——仍然不走运 更新 我通过在全局配置(axis2)中禁用文件锁定来解决问题 使残废

最近,我们开始研究WSO2 Api管理器,并希望创建一个故障流序列,该序列将有关故障的一些信息写入位于文件系统中的文件中。WSO2 API管理器安装适用于Windows

我按照中的文档步骤启用VFS传输。然后,我按照这个示例创建了一个文件代理和文件写入序列(我跳过了数据库和文件读取器,因为我不需要它们):

首先,我认为这是一个权限问题,但我授予了匿名用户对该位置的完全控制权,并以管理员身份运行WSO2 AM进程——仍然不走运

更新

我通过在全局配置(axis2)中禁用文件锁定来解决问题


使残废
它仍然不起作用,但错误略有不同(仍然抱怨路径)

原因:java.io.FileNotFoundException:C:\home\username\test\out\*(文件名、目录名或卷标语法不正确)
在java.io.FileOutputStream.open(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:221)
位于java.io.FileOutputStream。(FileOutputStream.java:142)
位于org.apache.commons.vfs2.provider.local.LocalFile.doGetOutputStream(LocalFile.java:251)
位于org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1399)
正如您可能注意到的,在结尾处有
“*”
,我对找不到整个文件路径并不感到惊讶,但它是由lib添加的,因此可能是预期的


有没有人有过WSO2 ESB/AM的经验并知道如何解决这个问题?这可能很简单,但经过多次尝试后,我找不到解决方案。

您的配置对我来说很有用,请看:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="writeFile"
       transports="http https"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="xml">
            <format>
               <moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/">
                  <INT_ID xmlns="">1</INT_ID>
               </moc:QRY_SELECT_SRH_PERSONA>
            </format>
            <args/>
         </payloadFactory>
         <log level="custom">
            <property name="sequence" value="fileWriteSequence"/>
         </log>
         <property xmlns:ns2="http://org.apache.synapse/xsd"
                   name="transport.vfs.ReplyFileName"
                   expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')"
                   scope="transport"/>
         <property name="transport.vfs.Locking" value="disable" scope="transport"/>
         <property name="OUT_ONLY" value="true"/>
         <send>
            <endpoint name="FileEpr">
               <address uri="vfs:file:///C:/home/username/test/out"/>
            </endpoint>
         </send>
      </inSequence>
      <outSequence/>
      <faultSequence>
         <log level="custom">
            <property name="text" value="Error Sequence FAIL"/>
            <property name="message" expression="get-property('ERROR_MESSAGE')"/>
            <property name="code" expression="get-property('ERROR_CODE')"/>
            <property name="detail" expression="get-property('ERROR_DETAIL')"/>
            <property name="exception" expression="get-property('ERROR_EXCEPTION')"/>
         </log>
      </faultSequence>
   </target>
</proxy>

1.
我在C:\home\username\test\out\8a11314c-4c22-4ad3-bbfc-4fb56ba415a0.txt中的文件 关于这一内容:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/"><INT_ID>1</INT_ID></moc:QRY_SELECT_SRH_PERSONA></soapenv:Body></soapenv:Envelope>
1
更新1:

代理配置之外的序列:

<sequence name="faultSEQ" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
         <payloadFactory media-type="xml">
            <format>
               <moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/">
                  <INT_ID xmlns="">1</INT_ID>
               </moc:QRY_SELECT_SRH_PERSONA>
            </format>
            <args/>
         </payloadFactory>
         <log level="custom">
            <property name="sequence" value="fileWriteSequence"/>
         </log>
         <property xmlns:ns2="http://org.apache.synapse/xsd"
                   name="transport.vfs.ReplyFileName"
                   expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')"
                   scope="transport"/>
         <property name="transport.vfs.Locking" value="disable" scope="transport"/>
         <property name="OUT_ONLY" value="true"/>
         <send>
            <endpoint name="FileEpr">
               <address uri="vfs:file:///C:/home/username/test/out"/>
            </endpoint>
         </send>
</sequence>

1.
所以我终于能够“修复”这个问题,但还没有完全解决

结果表明,
“*”
来自我为在WSO2 API管理器中访问的API创建的端点。所以,一旦我添加了新的端点(资源),例如
“/test”
,sequence就会在指定了所需内容的路径下创建一个文件“test”。
它仍然很不理想,因为看起来API管理器只是忽略了ReplyFileName参数。尽管如此,假设这解决了我面临的主要问题,所以我将从这一点开始进一步研究。

我认为您的地址uri是错误的。尝试vfs:file://C:/home/username/test/out而不是vfs:file:///C:/home/username/test/out (删除了一条斜线,因为它是窗口)好吧,我在调查时检查过,它没有改变任何东西。事实上,引擎本身添加了这个斜杠。我为这个锁做了一个变通方法(通过禁用),更新了我的消息。所以你添加了这个代理,但是你是否以某种方式将它链接到API?我需要编写一个错误的序列并将其链接到特定的API(最好是从API管理器UI)。您是如何触发此文件创建的?是的,当然,请查看此链接:好的,但是您使用了WSO ESB-您知道如何创建与WSO2 API管理器兼容的序列吗?WSO2 AM不在代理上运行,因此此解决方案与我需要的不匹配-抱歉,如果我的问题有误导性,但我想将此序列集成到WSO2 AM中,而不是普通ESBIf如果您阅读我的问题,我已经编写了相同的序列,因此它无法解决任何问题-在Windows上,文件未被创建(它无法创建路径C:/home/username/test/out/*),并且在Ubuntu上它将名为*的文件包装起来,但为空。这个序列在Api管理器中对您有效吗?
Caused by: java.io.FileNotFoundException: C:\home\username\test\out\* (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:142)
    at org.apache.commons.vfs2.provider.local.LocalFile.doGetOutputStream(LocalFile.java:251)
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1399)
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="writeFile"
       transports="http https"
       startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory media-type="xml">
            <format>
               <moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/">
                  <INT_ID xmlns="">1</INT_ID>
               </moc:QRY_SELECT_SRH_PERSONA>
            </format>
            <args/>
         </payloadFactory>
         <log level="custom">
            <property name="sequence" value="fileWriteSequence"/>
         </log>
         <property xmlns:ns2="http://org.apache.synapse/xsd"
                   name="transport.vfs.ReplyFileName"
                   expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')"
                   scope="transport"/>
         <property name="transport.vfs.Locking" value="disable" scope="transport"/>
         <property name="OUT_ONLY" value="true"/>
         <send>
            <endpoint name="FileEpr">
               <address uri="vfs:file:///C:/home/username/test/out"/>
            </endpoint>
         </send>
      </inSequence>
      <outSequence/>
      <faultSequence>
         <log level="custom">
            <property name="text" value="Error Sequence FAIL"/>
            <property name="message" expression="get-property('ERROR_MESSAGE')"/>
            <property name="code" expression="get-property('ERROR_CODE')"/>
            <property name="detail" expression="get-property('ERROR_DETAIL')"/>
            <property name="exception" expression="get-property('ERROR_EXCEPTION')"/>
         </log>
      </faultSequence>
   </target>
</proxy>
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/"><INT_ID>1</INT_ID></moc:QRY_SELECT_SRH_PERSONA></soapenv:Body></soapenv:Envelope>
<sequence name="faultSEQ" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
         <payloadFactory media-type="xml">
            <format>
               <moc:QRY_SELECT_SRH_PERSONA xmlns:moc="http://www.example.org/mockWS/">
                  <INT_ID xmlns="">1</INT_ID>
               </moc:QRY_SELECT_SRH_PERSONA>
            </format>
            <args/>
         </payloadFactory>
         <log level="custom">
            <property name="sequence" value="fileWriteSequence"/>
         </log>
         <property xmlns:ns2="http://org.apache.synapse/xsd"
                   name="transport.vfs.ReplyFileName"
                   expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')"
                   scope="transport"/>
         <property name="transport.vfs.Locking" value="disable" scope="transport"/>
         <property name="OUT_ONLY" value="true"/>
         <send>
            <endpoint name="FileEpr">
               <address uri="vfs:file:///C:/home/username/test/out"/>
            </endpoint>
         </send>
</sequence>