如何在Mulesoft中将睡眠设置为流而不会丢失消息有效负载

时间:2015-06-29 12:25:49

标签: java groovy mule mule-component

我想插入脚本来延迟Mulesoft中的处理流程。我试图在groovy中插入脚本,但我丢失了messagge有效负载,所以当我必须得到消息有效负载recived null指针。 我怎么能不丢失消息有效载荷?

由于

6 个答案:

答案 0 :(得分:18)

如果您在流程中使用 Groovy 组件,则可以按如下方式定义sleep(): -

<scripting:component doc:name="Groovy">
  <scripting:script engine="Groovy"><![CDATA[
    sleep(10000);
    return message.payload;]]>
  </scripting:script>
</scripting:component>

Groovy 记住 返回 message.payload,以便获得有效负载最后,否则您将获得 null 有效负载

Groovy 如果您不在最后返回,则会出现丢失有效负载的问题,因此,在 Groovy 中,您需要在结束时返回有效负载,并且这就是您收到 null 有效负载

的原因

或者,您可以使用表达式 - 组件,如下所示: -

<expression-component>
    Thread.sleep(10000);
</expression-component>

答案 1 :(得分:3)

您可以从Java组件,MEL组件甚至Groovy组件调用Thread.sleep。

然而,除非您正在测试某些东西,否则这是一个设计缺陷。如果这是用于生产(并且实际上需要延迟),请考虑其他解决方案,例如使用JMS的延迟消息。

答案 2 :(得分:1)

在Mule 4中,您应该使用运行时“等待”功能。任何其他选择都会阻塞您的所有线程。 https://docs.mulesoft.com/mule-runtime/4.1/dw-runtime-functions-wait

答案 3 :(得分:-1)

你可以使用如下的groovy代码:

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:http=http://www.mulesoft.org/schema/mule/http     
 xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" 
 xmlns="http://www.mulesoft.org/schema/mule/core" 
 xmlns:doc=http://www.mulesoft.org/schema/mule/documentation 
 xmlns:spring="http://www.springframework.org/schema/beans" 
 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-current.xsd 
 http://www.mulesoft.org/schema/mule/core 
 http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
 http://www.mulesoft.org/schema/mule/http 
 http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
 http://www.mulesoft.org/schema/mule/scripting 
 http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd">
  <flow name="groovyFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/groovy" allowedMethods="POST" doc:name="HTTP"/>
    <set-payload value="#[payload]" doc:name="Set Payload"/>
    <scripting:transformer doc:name="Groovy">
      <scripting:script engine="Groovy">
        <![CDATA[sleep(10000);
         System.out.println("Holding for 10 seconds");
         return message.payload;]]></scripting:script>
      </scripting:transformer>
  </flow>
</mule>

答案 4 :(得分:-2)

你可以在这里使用groovy代码,如下所示。

def name = sessionVars.username;         
def a = sessionVars.int1.toInteger()+1;        
def b = sessionVars.int2.toInteger();          
def c = a+b;      
sessionVars.sum = c;      
sessionVars.int1 = a;      
if(name != null){       
name = name           
}           
else{            
name = '';            
}      
sleep(3000);        
System.out.println("Holding the flow for 3000 ms");     

答案 5 :(得分:-3)

您可以使用Groovy组件来添加延迟。

sleep(20000)