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 中的本地传输。

[1] https://docs.wso2.com/display/EI650/Local+Transport

每个版本的 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