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