Activemq 后端服务上的Mule节流

Activemq 后端服务上的Mule节流,activemq,mule,throttling,Activemq,Mule,Throttling,我有一个后端服务,我需要限制访问。我尝试使用这里描述的方法: 我从一个简单的传递流开始,它接收SOAP请求并转发它。当我使用SOAPUI实用程序点击这个按钮时,我会在一两秒钟内得到预期的响应 <http:connector name="httpConnector" doc:name="HTTP\HTTPS"> <receiver-threading-profile maxThreadsActive="1" maxBufferSize="100" /> </h

我有一个后端服务,我需要限制访问。我尝试使用这里描述的方法:

我从一个简单的传递流开始,它接收SOAP请求并转发它。当我使用SOAPUI实用程序点击这个按钮时,我会在一两秒钟内得到预期的响应

<http:connector name="httpConnector" doc:name="HTTP\HTTPS">
    <receiver-threading-profile maxThreadsActive="1" maxBufferSize="100" />
</http:connector>

<jms:activemq-connector name="amqConnector" brokerURL="tcp://localhost:61616" specification="1.1" doc:name="AMQ" />

<flow name="Flow1" processingStrategy="synchronous" doc:name="Flow1">

    <http:inbound-endpoint exchange-pattern="request-response" 
        host="localhost" port="8088" path="test" doc:name="HTTP" 
        mimeType="text/xml" encoding="UTF-8" connector-ref="httpConnector"/>

    <http:outbound-endpoint
        address="http://dnbdirect-api.dnb.com/DnBAPI-11"
        exchange-pattern="request-response" doc:name="HTTP" mimeType="text/xml"/>
</flow>

如果我随后将出站调用移动到一个单独的流,并添加到请求-应答块中,则行为会发生变化。我没有收到任何响应(也没有从记录器收到“After queue”消息),SOAPUI最终超时

<http:connector name="httpConnector" doc:name="HTTP\HTTPS">
    <receiver-threading-profile maxThreadsActive="1" maxBufferSize="100" />
</http:connector>

<jms:activemq-connector name="amqConnector" brokerURL="tcp://localhost:61616" specification="1.1" doc:name="AMQ" />

<flow name="Flow1" processingStrategy="synchronous" doc:name="Flow1">

    <http:inbound-endpoint exchange-pattern="request-response" 
        host="localhost" port="8088" path="test" doc:name="HTTP" 
        mimeType="text/xml" encoding="UTF-8" connector-ref="httpConnector"/>

    <message-properties-transformer  doc:name="Message Properties">
        <add-message-property key="AMQ_SCHEDULED_DELAY" value="5000"/>
    </message-properties-transformer>

    <logger message="Before queue" level="INFO"/>

    <request-reply>
        <jms:outbound-endpoint queue="request" connector-ref="amqConnector"></jms:outbound-endpoint>
        <jms:inbound-endpoint queue="response" connector-ref="amqConnector"></jms:inbound-endpoint>
    </request-reply>  

    <logger message="After queue" level="INFO"/>
</flow>

<flow name="flow2" doc:name="Flow2">

    <jms:inbound-endpoint queue="request" connector-ref="amqConnector" doc:name="JMS"/>

    <http:outbound-endpoint 
        address="http://dnbdirect-api.dnb.com/DnBAPI-11" 
        exchange-pattern="request-response" doc:name="HTTP" mimeType="text/xml" />
</flow>

当我退出对后端服务的调用时,当我看到延迟时,节流行为起作用。但我不能让它与那里的服务电话一起工作


我缺少什么?

尝试在flow2中的HTTP出站端点之前添加以下内容:

<copy-properties propertyName="MULE_*"/>

我发现消息的有效负载将在“request-reply”之后显示为“ArrayList”。 因此,我添加了一个java组件来拆分它,然后结果将被更正

@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
    MuleMessage message = eventContext.getMessage();

    //int groupSize = message.getCorrelationGroupSize();
    //System.out.println("############# correlationGroupSize: " + groupSize);

    Object payload = message.getPayload();
    if (payload != null && payload instanceof ArrayList) {
        //message.setPayload(((ArrayList)payload).get(0));
        return ((ArrayList)payload).get(0);
    }

    return message.getPayload();
}
完成的流程是:




尝试在您的流程2中的http:outbound之后添加一个记录器,并检查有效负载是什么。我有,它似乎是正确的。由于篇幅太长(我对StackOverflow没有太多经验),我不能把它放在这条评论中…将它添加到原始消息中以显示它是正常的做法吗?这对我很有用。你能展示一下你的新配置吗。流程仍然没有成功…也就是说,它没有给我预期的结果,但是行为已经随着添加而改变。我现在进入“后队列”日志记录,没有超时。生成的有效负载与我期望的不同,即,与不使用队列的情况不同。也许通过队列的通道正在改变信息的格式?无论如何,为了满足您的请求,如何发布后续配置,因为它们不适合注释?你必须改变原来的信息吗?我要补充一点,我不相信Mule网站上的方法真的能起到节流作用。然而,这已成为一种学习经验。
    <message-properties-transformer  doc:name="Message Properties">
        <add-message-property key="AMQ_SCHEDULED_DELAY" value="10000"/>
    </message-properties-transformer>

    <request-reply storePrefix="mainFlow">
        <jms:outbound-endpoint queue="request" connector-ref="amqConnector" doc:name="JMS"></jms:outbound-endpoint>
        <jms:inbound-endpoint queue="response" connector-ref="amqConnector" doc:name="JMS"></jms:inbound-endpoint>
    </request-reply>
    <component class="com.neusoft.fx.JmsMessageTransformer" doc:name="Java"/>
    <message-properties-transformer doc:name="Set Content Type">
        <delete-message-property key="Content-type" />
        <add-message-property key="Content-Type" value="text/xml"/>
    </message-properties-transformer> 
    <logger message="----- LOGGER ----- after #[groovy:message.toString()]" level="INFO" doc:name="Logger" />
</flow>