我有一个接收HTTP请求的Mule应用程序(http inbount endpoint。)当我启动服务器时,我需要确保Mule应用程序准备好在我启动另一个程序之前接收请求,让& #39; s称之为程序B,即将请求发送到Mule应用程序的客户端。
虽然Mule与Ubuntu中的程序B几乎同时启动,但程序B比Mule应用程序更快起来。程序B仅获得"连接被拒绝" Errno111直到Mule应用程序准备就绪,虽然不是一个关键问题(感谢重试),但每次启动时都会发生这种情况很烦人。因此,我需要让程序B空闲一段时间,直到应用程序准备好接收请求为止。
到目前为止,我可以想到两种方法。第一种是在我的shell脚本(程序B)中使用硬编码的整数,例如:
sleep 180
希望Mule应用程序准备就绪足够长。它确实非常可靠,因为Mule和应用程序在每次启动服务器时都是相同的,因此在给定相同硬件/操作系统的情况下,它们往往需要相同的时间。
我想到的第二个解决方案是检查Mule的输出或附加到其日志文件的新行,并在Mule应用程序准备好启动时触发程序。当应用程序准备就绪时,你通常在主mule.log和stdout中都有这样的一行:
+ Started app 'myapp' +
然后我可以睡几秒钟以确定,然后开始提出请求。
然而,我想知道是否有更精致的方法来做到这一点。例如,程序B可能是预期Mule准备就绪时通知的程序。或者,可能有一种方法可以更清晰地查询Mule,以判断应用程序是否已准备就绪。
感谢您的建议!
答案 0 :(得分:1)
Mule ESB有JMX interface,提供端点状态。
<management:jmx-server>
<management:connector-server url="service:jmx:rmi:///jndi/rmi://localhost:1099/server" rebind="false" />
</management:jmx-server>
JMX MBean
评估属性&#39; Connected = true&#39;在启动其他进程之前由jmx客户端进行。
Mule.$YOUR_SERVICE_NAME > Endpoint > $FLOW_NAME > $CONNECTOR_NAME
+ Attribute: 'Connected' (true/false)
答案 1 :(得分:0)
作为一个解决方案,我每隔10秒向Mule发送一个测试请求(一个简单的GET而不是POST),如果我收到连接拒绝错误,那么循环继续。当请求通过时,程序B可以安全启动。在主流程中,我正在使用POST请求中的选项和单独的GET请求,因此POST请求执行他们一直以来所做的事情,而GET请求仅用于检查应用程序是否已启动。可能有一种更简单的方法从Mule获取信息,但这似乎远比等待几秒钟或点击日志要好得多。