WSO2 Micro Integrator 1.2.0 通过本地传输调用数据服务
WSO2 Micro Integrator 1.2.0 call data service over local transport
我有一个调用数据服务的代理服务。我想通过本地传输调用数据服务,但出现错误:
[2020-12-19 23:48:59,567] ERROR {ClientUtils} - The system cannot infer the transport information from the local:///services/test/ URL.
[2020-12-19 23:48:59,567] ERROR {Axis2Sender} - {proxy:TST2} Unexpected error during sending message out org.apache.axis2.AxisFault: The system cannot infer the transport information from the local:///services/test/ URL.
at org.apache.axis2.description.ClientUtils.inferOutTransport(ClientUtils.java:86)
at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.executeImpl(DynamicAxisOperation.java:116)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:656)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:86)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:573)
at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:409)
at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:74)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:123)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:226)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:458)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:181)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
我的序列是
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="TST2" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:test="test-ns">
<soapenv:Header />
<soapenv:Body>
<test:_get_test_getcnt />
</soapenv:Body>
</soapenv:Envelope>
</format>
</payloadFactory>
<header name="soapAction" scope="transport" value="urn:_get_test_getcnt"></header>
<send>
<endpoint>
<address uri="local:///services/test/" format="soap11"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" />
<respond />
</outSequence>
<faultSequence>
<log level="full" />
</faultSequence>
</target>
<publishWSDL key="wsdl"></publishWSDL>
</proxy>
数据服务已允许本地传输:
<data transports="http local https" serviceNamespace="test-ns" name="test">
如果我将端点地址 uri 更改为 HTTP 传输 http://localhost:8290/services/test/ 一切正常。
我是不是做错了什么,或者 WSO2 Micro Integrator 1.2.0 不支持本地传输?
您是否启用了 [1] 中提到的 MI 中的本地传输。
每个版本的 Enterprise Integrator 的答案都不同。
对于版本 6.x.x
您可以使用本手册:https://docs.wso2.com/display/EI650/Local+Transport
对于版本 7.x.x
不幸的是,版本 7.x.x 在许多部分(包括这一部分)中的记录都非常少。
解决方案
将以下部分添加到您的 conf/deployment.toml
[transport.local.sender.nonblocking]
enable = true
备注
在旧的解决方案中,还需要将 ServerURL 属性 替换为
<ServerURL>https://${carbon.local.ip}:${carbon.management.port}${carbon.context}/services/</ServerURL>
然而,即使没有这个改变,我的 EI 的本地交通工具也能正常工作
为什么有效
与之前的版本一样,需要做的是在conf/axis2/axis2.xml
中手动添加以下行
<transportSender name="local" class="org.apache.axis2.transport.local.NonBlockingLocalTransportSender"/>
不幸的是,这将不起作用,因为一旦企业集成器启动,您的文件将被替换为一个新文件而无需您对其进行更改。
您的 axis2.xml 正在被从位置 repository/resources/conf/templates/conf/axis2/axis2.xml.j2[=15 生成的 jinja2 模板替换=]
大家可以注意到里面有这样一段代码:
{% if transport.local.sender.nonblocking.enable == true %}
<transportSender name="local" class="org.apache.axis2.transport.local.NonBlockingLocalTransportSender"/>
{% endif %}
这意味着您需要做的就是添加 属性 transport.local.sender.nonblocking.enable 并将其设置为 true
我有一个调用数据服务的代理服务。我想通过本地传输调用数据服务,但出现错误:
[2020-12-19 23:48:59,567] ERROR {ClientUtils} - The system cannot infer the transport information from the local:///services/test/ URL.
[2020-12-19 23:48:59,567] ERROR {Axis2Sender} - {proxy:TST2} Unexpected error during sending message out org.apache.axis2.AxisFault: The system cannot infer the transport information from the local:///services/test/ URL.
at org.apache.axis2.description.ClientUtils.inferOutTransport(ClientUtils.java:86)
at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.executeImpl(DynamicAxisOperation.java:116)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:656)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:86)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:573)
at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:409)
at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:74)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:123)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:109)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:71)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:226)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:458)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:181)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
我的序列是
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="TST2" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:test="test-ns">
<soapenv:Header />
<soapenv:Body>
<test:_get_test_getcnt />
</soapenv:Body>
</soapenv:Envelope>
</format>
</payloadFactory>
<header name="soapAction" scope="transport" value="urn:_get_test_getcnt"></header>
<send>
<endpoint>
<address uri="local:///services/test/" format="soap11"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="full" />
<respond />
</outSequence>
<faultSequence>
<log level="full" />
</faultSequence>
</target>
<publishWSDL key="wsdl"></publishWSDL>
</proxy>
数据服务已允许本地传输:
<data transports="http local https" serviceNamespace="test-ns" name="test">
如果我将端点地址 uri 更改为 HTTP 传输 http://localhost:8290/services/test/ 一切正常。 我是不是做错了什么,或者 WSO2 Micro Integrator 1.2.0 不支持本地传输?
您是否启用了 [1] 中提到的 MI 中的本地传输。
每个版本的 Enterprise Integrator 的答案都不同。
对于版本 6.x.x
您可以使用本手册:https://docs.wso2.com/display/EI650/Local+Transport
对于版本 7.x.x
不幸的是,版本 7.x.x 在许多部分(包括这一部分)中的记录都非常少。
解决方案
将以下部分添加到您的 conf/deployment.toml
[transport.local.sender.nonblocking]
enable = true
备注
在旧的解决方案中,还需要将 ServerURL 属性 替换为
<ServerURL>https://${carbon.local.ip}:${carbon.management.port}${carbon.context}/services/</ServerURL>
然而,即使没有这个改变,我的 EI 的本地交通工具也能正常工作
为什么有效
与之前的版本一样,需要做的是在conf/axis2/axis2.xml
中手动添加以下行<transportSender name="local" class="org.apache.axis2.transport.local.NonBlockingLocalTransportSender"/>
不幸的是,这将不起作用,因为一旦企业集成器启动,您的文件将被替换为一个新文件而无需您对其进行更改。 您的 axis2.xml 正在被从位置 repository/resources/conf/templates/conf/axis2/axis2.xml.j2[=15 生成的 jinja2 模板替换=]
大家可以注意到里面有这样一段代码:
{% if transport.local.sender.nonblocking.enable == true %}
<transportSender name="local" class="org.apache.axis2.transport.local.NonBlockingLocalTransportSender"/>
{% endif %}
这意味着您需要做的就是添加 属性 transport.local.sender.nonblocking.enable 并将其设置为 true