0

我有一个接收 HTTP 请求(http 入站端点)的 Mule 应用程序。当我启动服务器时,我需要确保 Mule 应用程序在启动另一个程序之前准备好接收请求,我们称之为程序 B,这是向 Mule 应用程序发送请求的客户端。

虽然 Mule 与 Ubuntu 中的程序 B 几乎同时启动,但程序 B 的启动和启动速度要比 Mule 应用程序快得多。程序 B 只会在 Mule 应用程序准备好之前获得“连接被拒绝”Errno111,虽然这不是一个关键问题(由于重试),但每次启动时都会看到这种情况令人讨厌。因此,我需要让程序 B 空闲一段时间,直到应用程序准备好接收请求。

到目前为止,我可以想到两种方法来做到这一点。第一种是在我的 shell 脚本(程序 B)中使用硬编码整数,例如:

sleep 180

希望它足够长,让 Mule 应用程序准备就绪。它确实工作得非常可靠,因为每次启动服务器时 Mule 和应用程序都是相同的,因此在相同的硬件/操作系统下,它们往往花费相同的时间。

我正在考虑的第二个解决方案是检查 Mule 的输出或附加到其日志文件的新行,并在 Mule 应用程序准备好启动时触发程序。当应用程序准备就绪时,您通常在主 mule.log 和标准输出中都有这样的一行:

+ Started app 'myapp'                      +

然后我可以睡几秒钟以确定,然后开始提出请求。

但是,我想知道是否没有更精致的方法来做到这一点。例如,程序 B 可能是希望在准备好时收到 Mule 通知的程序 B。或者可能有一种方法可以以更简洁的方式查询 Mule,以判断应用程序是否准备就绪。

感谢您的建议!

4

2 回答 2

1

Mule ESB 有一个提供端点状态的JMX 接口。

<management:jmx-server>
   <management:connector-server url="service:jmx:rmi:///jndi/rmi://localhost:1099/server" rebind="false" />
</management:jmx-server>

JMX MBean

在启动其他进程之前,由 jmx 客户端评估属性“Connected=true”。

Mule.$YOUR_SERVICE_NAME > Endpoint > $FLOW_NAME > $CONNECTOR_NAME
  + Attribute: 'Connected' (true/false)
于 2014-08-21T20:33:19.257 回答
0

作为一种解决方案,我每 10 秒向 Mule 发送一个测试请求(一个简单的 GET,而不是一个 POST),如果我收到连接被拒绝错误,则循环继续。当请求通过时,程序 B 可以安全启动。在主要流程中,我使用了一个选项并将 GET 请求与 POST 请求分开,因此 POST 请求执行它们一直在执行的操作,而 GET 请求仅用于检查应用程序是否启动。可能有比这更简单的从 Mule 获取信息的方法,但这似乎比等待几秒钟或 grepping 日志要好得多。

于 2014-05-20T13:42:56.240 回答