首页 > 解决方案 > 为什么存在中介策略时 WSO2 API Manger 无法执行 PUT 请求?

问题描述

我有请求和响应的中介设置: 在此处输入图像描述

对于请求(jms_in_flow)

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="jms_in_flow" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<property name="transactionId" expression="get-property('MessageID')"/>
<clone continueParent="true">
    <target>
        <sequence>
            <property action="remove" name="OUT_ONLY" value="true"/>
            <property expression="$ctx:api.ut.api_version" name="api_version" scope="transport" type="STRING"/>
            <property expression="$ctx:api.ut.version" name="api_short_version" scope="transport" type="STRING"/>
            <property expression="$ctx:api.ut.requestTime" name="api_request_time" scope="transport" type="STRING"/>
            <property expression="$ctx:REST_API_CONTEXT" name="api_context" scope="transport" type="STRING"/>
            <property expression="$ctx:API_NAME" name="api_name" scope="transport" type="STRING"/>
            <property name="api_message_id" expression="get-property('transactionId')" scope="transport"/>
            <property value="REQUEST" name="api_message_type" scope="transport" type="STRING"/>
            <property expression="$ctx:REST_FULL_REQUEST_PATH" name="api_request_path" scope="transport" type="STRING"/>
            <property expression="$ctx:api.ut.HTTP_METHOD" name="api_method" scope="transport" type="STRING"/>
            <property expression="$ctx:api.ut.application.name" name="api_app_name" scope="transport" type="STRING"/>
            <property expression="$ctx:api.ut.userName" name="api_username" scope="transport" type="STRING"/>
            <call>
                <endpoint>
                    <address uri="jms:"AAA"/>
                </endpoint>
            </call>
            <drop/>
            <send/>
        </sequence>
    </target>
</clone>

对于响应(jms_out_flow):

<sequence name="jms_out_flow" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
<clone continueParent="true">
    <target>
        <sequence>
            <property name="RESPONSE" value="true"/>
            <property name = "api_response_time" expression = "get-property('SYSTEM_TIME')" scope="transport"/> 
            <property name="api_message_id" expression="get-property('transactionId')" scope="transport"/>
            <property value="RESPONSE" name="api_message_type" scope="transport" type="STRING"/>
            <property expression="$axis2:HTTP_SC" name="http_status" scope="transport" type="STRING"/>
            <call>
                <endpoint>
                    <address uri="jms:/AAA"/>
                </endpoint>
            </call>
            <drop/>
        </sequence>
    </target>
</clone>

当我在 WSO2 管理器上执行 GET 请求时,它执行得又快又成功,而 PUT 请求没有执行,并且在时间到期(~2 分钟)后下降。当我删除请求的中介设置 (jms_in_flow) 时,PUT 请求开始正常工作。
我认为错误在jms_in_flow中,但我找不到。我在google中找到:在此处输入链接描述 在此处输入图像描述 get和put方法的处理不同,但我不知道如何应用。更新。日志

[2019-07-01 13:38:06,083] ERROR -  Unexpected error during sending message out {org.apache.synapse.core.axis2.Axis2Sender}
   org.apache.axis2.AxisFault: Did not receive a JMS response within 30000 ms to destination : temp-queue://ID:c115c33d0c81-45342-543:1:1 with JMS correlation ID : ID:c115c33d0c81-45342-543:1:1:1:1
at org.apache.axis2.transport.base.AbstractTransportSender.handleException(AbstractTransportSender.java:234)


at org.apache.axis2.transport.jms.JMSSender.waitForResponseAndProcess(JMSSender.java:435)


at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:369)


at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:192)


at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)


at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)


at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.send(DynamicAxisOperation.java:185)


at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.executeImpl(DynamicAxisOperation.java:167)


at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)


at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:603)


at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:85)


at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:511)


at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:384)


at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:65)


at org.apache.synapse.mediators.builtin.CallMediator.handleNonBlockingCall(CallMediator.java:276)


at org.apache.synapse.mediators.builtin.CallMediator.mediate(CallMediator.java:121)


at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108)


at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:70)


at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)


at org.apache.synapse.mediators.MediatorWorker.run(MediatorWorker.java:80)


at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)


at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)


at java.lang.Thread.run(Thread.java:748)

标签: wso2

解决方案


我不确定这是否相关。但我认为你也需要<property action="remove" name="OUT_ONLY" value="true"/>在 out 序列中。


推荐阅读