这篇文章对我和任何对网络连接器如何为ActiveMQ工作感兴趣的ActiveMQ贡献者而言都是更多的内容。 我最近花了一些时间查看代码,并认为最好画一些快速的图表来帮助我记住我学到的东西,并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入有误,并且您想添加说明,请在评论中添加。
首先,通过在ActiveMQ配置文件中对其进行配置来设置网络连接器。 使用xbean库将此配置映射到相应的ActiveMQ bean,对此我有一个单独的博客文章 ,其中确切解释了如何完成此工作。 要指定网络连接器,请将
<networkConnectors/>
元素添加到配置文件中,然后添加<networkConnector/>
, <multicastNetworkConnector/>
或<ldapNetworkConnector/>
。 这三种不同类型的网络连接器可用于建立代理网络,其中<networkConnector/>
最常见。 这是三个映射到Java类的方式: <networkConnector/>
映射到org.apache.activemq.network.DiscoveryNetworkConnector <multicastNetworkConnector/>
映射到org.apache.activemq.network.MulticastNetworkConnector <ldapNetworkConnector/>
映射到org.apache.activemq.network.LdapNetworkConnector 每个继承自
org.apache.activemq.network.NetworkConnector
超级类型,如下图所示: 因此,当您具有如下配置时:
<networkConnector uri="static://(tcp://localhost:61626,tcp://localhost:61627)" />
一个新的DiscoverNetworkConnector将被配置,实例化,并作为连接器添加到BrokerService(这是处理许多ActiveMQ代理详细信息的主要类)。 从配置中组装DiscoverNetworkConnector时,您指定的URI用于创建DiscoveryAgent。 发现代理负责组装连接并处理打包为DiscoverEvents的故障转移事件。 确定选择哪个DiscoverAgent取决于DiscoverAgentFactory和指定的URI。 在“静态”的情况下,使用SimpleDiscoverAgent。 可能的URI列表中的每个URI都有不同的处理方式,并为其分配了自己的传输(此操作将在几秒钟内完成)。 这意味着,对于您列出的每个URI,将建立一个新的套接字,并且代理将尝试在每个套接字上建立网络连接器。 您可能想知道如何最好地实施故障转移? 在上述情况下,您将有多个连接,并且如果这些连接之一是到未监听的从属的连接,您将看到该连接失败,并且发现代理尝试再次建立连接。 这可能会无限持续下去,从而消耗资源。 另一种方法是对使用failover()逻辑的静态发现代理仅使用一个URI:
<networkConnector uri="static:failover:(tcp://localhost:61626,tcp://localhost:61627)" />
在这种情况下,将仅创建一个传输,并且故障转移逻辑将对其进行包装并了解两个URI。 如果一个不可用,它将不会继续不必要地重试。 相反,它将连接到它可以连接的任何一个,并且仅在当前连接断开时才重新连接到故障转移URL。 请注意,此方法在ActiveMQ 5.5.1.-fuse-00-06版本之前存在一个错误。
发现代理负责创建网桥,但它将该职责委托给DiscoverListener。 在上面的示例中,DiscoverListener接口由DiscoverNetworkConnector.onServiceAdd()方法实现。
为了建立网桥,将为本地代理(使用VM)和远程代理(使用指定的协议,在本例中为TCP)打开传输。 一旦创建了本地和远程传输,就可以在DiscoverNetworkConnector.createBridge(…)方法中组装网桥。 此方法再次使用Factory模式来查找要使用的网桥。
可能的桥接器实现如下所示:
默认情况下,当conductorSubscriptions = true时,将使用DurableConduitBridge。 管道订阅建立到远程代理的单一消息流,以减少当远程主题有多个使用者时可能发生的重复。 默认情况下,这很好用,但是如果要在所有使用者之间平衡消息的负载,则需要将管道订阅设置为false(请参阅FuseSource Broker上FuseSource 的文档,以了解管道订阅的文档)。 设置为false时,将使用DemandForwardingBridge。 组装好网桥后,即可在NetworkConnector.configureBridge(…)方法中对其进行配置。
在桥上组装并配置完所有组件后,便会开始。 一旦启动,它将开始将代理程序Command对象发送到远程代理程序以进行自我标识,建立会话并从中获取消费者信息。 从图中可以看到,这是在DemandForwardingBridgeSupport.startRemoteBridge()超类方法中。
如果您要调试网络连接器中的错误,希望这有助于确定可能发生错误的位置。
参考: 在代码内部: Christian Posta软件博客上的JCG合作伙伴 Christian Posta提供的ActiveMQ网络连接器 。
翻译自: https://www.javacodegeeks.com/2012/06/activemq-network-connectors.html