Apache ActiveMQ Artemis 支持 OpenWire 协议,以便 Apache ActiveMQ "Classic" JMS 客户端可以直接与 Apache ActiveMQ Artemis 服务器通信。默认情况下,配置了一个 acceptor 用于在端口 61616 上接受 OpenWire 连接。

有关为 OpenWire 配置 acceptor 的详细信息,请参阅一般 协议和互操作性 章节。

请参阅 OpenWire 示例,以了解此功能的实际应用。

1. 连接监控

OpenWire 有几个参数可以控制如何监控每个连接,它们是

maxInactivityDuration

它指定了在未收到数据的情况下,代理关闭连接的时间(毫秒)。默认值为 30000。

maxInactivityDurationInitalDelay

它指定了在连接上启动非活动监控之前的最大延迟(毫秒)。如果代理负载很重,并且同时创建了大量连接,这将很有用。默认值为 10000。

useInactivityMonitor

值为 false 将完全禁用 InactivityMonitor,连接将永远不会超时。默认情况下,它已启用。在代理端,您不需要设置此值。相反,您可以将 connection-ttl 设置为 -1。

useKeepAlive

指示是否在空闲连接上发送 KeepAliveInfo 以防止其超时。默认情况下已启用。禁用 keep alive 仍然会导致连接超时,如果在指定时间内未在连接上收到数据。

请注意,在开始时,InactivityMonitor 会协商合适的 maxInactivityDurationmaxInactivityDurationInitalDelay。连接将采用最短的持续时间。

有关更多详细信息,请参阅 ActiveMQ InactivityMonitor

2. 禁用/启用通知

默认情况下,通知主题 (ActiveMQ 通知) 会被创建,以便向监听的客户端发送某些类型的通知消息。因此,通知地址和队列将显示在管理控制台中,以及用户部署的地址和队列。这有时会导致混淆,因为通知对象是在内部管理的,而用户对此并不知情。此外,用户可能根本不希望使用通知主题(它们会消耗额外的资源并降低性能),并且从代理端禁用它们会很方便。

该协议提供了两个参数来控制代理端的通知行为。

supportAdvisory

指示代理是否支持通知消息。如果值为 true,将创建通知地址/队列。如果值为 false,则不会创建任何通知地址/队列。默认值为 true

suppressInternalManagementObjects

指示是否将通知地址/队列(如果有)注册到管理服务(例如,JMX 注册表)。如果设置为 true,则不会注册任何通知地址/队列。如果设置为 false,则会注册这些地址/队列,并将显示在管理控制台中。默认值为 true

这两个参数是在 OpenWire acceptor 上配置的,例如

<acceptor name="artemis">tcp://127.0.0.1:61616?protocols=OPENWIRE;supportAdvisory=true;suppressInternalManagementObjects=false</acceptor>

3. OpenWire 目的地缓存

为了提高代理的性能,我们会缓存最近使用的目的地,这样,当新消息被分发到这些目的地时,我们就不必每次都进行查找。默认情况下,此缓存最多保存 16 个目的地。如果添加了其他目的地,它们将覆盖较旧的记录。如果您处理的是大量的队列,您可能需要增加此值,这可以通过配置选项完成:openWireDestinationCacheSize,在 OpenWire acceptor 上设置,如下所示

<acceptor name="artemis">tcp://127.0.0.1:61616?protocols=OPENWIRE;openWireDestinationCacheSize=64</acceptor>

此缓存必须设置为 2 的幂,即:216128 等等。

4. 虚拟主题消费者目的地转换

对于现有虚拟主题目的地的 OpenWire 消费者,可以配置一个映射函数,该函数会将虚拟主题消费者目的地转换为 FQQN 地址。此地址将代表消费者作为对表示虚拟主题的地址的多播绑定。

配置字符串列表属性 virtualTopicConsumerWildcards 的部分由 ; 分隔。第一个是经典样式的目的地过滤器,它标识目的地属于虚拟主题。第二个标识标识消费者队列的 路径 数,以便可以从目的地中解析它。任何后续部分都是该映射的附加配置参数。

例如,消费者前缀为 Consumer.. 的默认虚拟主题,需要 virtualTopicConsumerWildcards 过滤器为 Consumer..>;2。作为 url 参数,当 url 有意义的字符 >; 被它们的十六进制代码点转义时,它会转换为 Consumer.*.%3E%3B2。在 acceptor url 中,它将是

<acceptor name="artemis">tcp://127.0.0.1:61616?protocols=OPENWIRE;virtualTopicConsumerWildcards=Consumer.*.%3E%3B2</acceptor>

这会将 Consumer.A.VirtualTopic.Orders 转换为 VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders 的 FQQN,使用配置的整数组件 2 标识消费者队列作为目的地的前两个路径。virtualTopicConsumerWildcards 是使用 , 分隔符的多值。

4.1. selectorAware

映射支持一个可选参数 selectorAware,当设置为 true 时,会将 OpenWire 消费者中的任何选择器信息传输到任何自动创建的订阅队列的队列过滤器中。

选择器/过滤器以正常方式与队列绑定持久化,使其独立于连接的消费者工作。

请参阅 OpenWire 示例 中包含的虚拟主题映射示例。

5. 日志记录

通过为 org.apache.activemq.artemis.core.protocol.openwire.OpenWireConnection 启用 TRACE,可以记录传入和传出的 OpenWire 命令。这对于调试或简单地监控客户端活动非常有用。除了 OpenWire 命令本身之外,还会记录客户端的远程 IP 地址以及内部连接 ID,以便可以将来自同一客户端的命令关联起来。

按照 这些步骤 来适当地配置日志记录。