我正在使用Mule ESB CE 3.5.0并且看到我认为TCP连接上的资源泄漏。我正在连接VisualVM并检查内存。我看到它随着时间的推移而增加而不会减少。
我的场景是我将消息发送到Mule,Mule做了它的事情,然后调度到远程TCP端点(通常在同一个盒子上)。我所做的并不是启动从Mule的TCP出站端点接收消息的程序。所以没有什么可以听Mule发送的消息。
我将TCP连接器配置如下:
<tcp:connector name="TcpConnector" keepAlive="true" keepSendSocketOpen="true" sendTcpNoDelay="true" reuseAddress="true">
<reconnect-forever frequency="2000" />
<tcp:xml-protocol />
</tcp:connector>
<tcp:endpoint name="TcpEndpoint1" responseTimeout="3000" connector-ref="TcpConnector" host="${myHost}" port="${myPort}" exchange-pattern="one-way" />
我的问题是:
当流无法发送到TCP出站端点时,该消息会发生什么?消息是否保存在内存中,一旦TCP连接器建立与远程端点的连接,所有累积的消息是否会突发并被分派?
当重新连接策略阻塞时,我认为它是一个尝试建立连接的调度程序线程。如果我们有更多的消息要发送,那么是否有更多的调度程序线程与尝试重新连接相关联?如果它是非阻塞会发生什么?
谢谢!
编辑:
如果我也理解the threading documentation correctly,那是否意味着如果我将默认线程配置文件设置为poolExhaustedAction =“RUN”,并且所有调度程序线程阻塞等待连接,最终流线程,然后接收器线程将阻止尝试建立连接。当远程应用程序再次开始侦听时,来自被阻塞线程的所有积压消息都将突然显示。
因此,如果流接收瞬态数据,则应将其配置为具有非阻塞重新连接,并且因为可以丢弃消息(在我的用例中),然后我们可以处理将被抛出的异常
答案 0 :(得分:0)
我会指向documentation:
非阻止重新连接
默认情况下,重新连接策略将阻止Mule应用程序 消息处理直到它能够连接/重新连接。当你 启用非阻塞重新连接,应用程序不需要 在重新启动之前等待所有端点重新连接。此外, 如果连接丢失,则重新连接发生在线程上 与应用程序线程分开。请注意,此类行为可能或 可能不合适,具体取决于您的应用需求。
在阻止重新连接策略时,您将获得的是调度程序将被阻止,以获得可用的连接。这些消息在技术上并没有保留在任何地方,它们的流量只是停止了。
关于第二个问题,它在运输和运输之间发生了变化。在这种非常特殊的情况下,假设tcp是每个请求传输的连接,不同的调度程序将尝试从get池connections尝试另一个套接字。
如果是非阻止策略,您将获得异常。您可以轻松地测试它。