跳到主要内容

向单一消费者传递消息

Solace PubSub+ 事件代理支持一种“仅传递给一个”功能,允许生产者指定,如果其发送的消息与事件代理上的多个直接传输客户端的订阅匹配,则该消息只能传递给其中至多一个客户端。此功能可用于在一组消费者之间实现负载均衡。

在与 JMS 一起使用时,“仅传递给一个”功能具有以下限制:

  • 只能为使用直接传输模式发送的非持久化消息指定“仅传递给一个”功能。
  • “仅传递给一个”消费者的组必须使用直接传输绑定到非持久化端点,并且每个连接仅有一个消费者。

生产者的“仅传递给一个”行为由 JNDI 连接工厂的 deliver-to-one 属性指定。如果将此属性设置为 true,则该连接的生产者将使用“仅传递给一个”功能发送所有消息。

但是,可以通过 SOLACE_JMS_PROP_DELIVER_TO_ONE 属性在每条消息的基础上启用或禁用该功能。此消息属性将覆盖连接工厂的设置。例如,要确保使用“仅传递给一个”功能发送消息,可以按以下方式设置消息属性:

TextMessage message = session.createTextMessage("text message");
message.setBooleanProperty(SupportedProperty.SOLACE_JMS_PROP_DELIVER_TO_ONE, true);

默认情况下,连接工厂启用了“仅传递给一个”的覆盖功能,并且使用该默认连接工厂设置创建的消费者使用“仅传递给一个”的覆盖功能连接到事件代理。因此,这些消费者接收所有匹配的消息,无论生产者是否使用“仅传递给一个”功能发送消息。

要为使用直接传输的非持久化消费者启用“仅传递给一个”功能,请使用 SolAdmin 或 CLI 禁用连接工厂的 DTO 覆盖属性(deliver-to-one-override)。

还可以为每个消费者设置传递优先级。优先级范围从 1(最高优先级)到 4(最低优先级)。当发布“仅传递给一个”消息时,具有最高优先级的客户端将接收该消息。如果多个客户端具有相同的优先级,则以轮询方式选择客户端。优先级由 JNDI 连接工厂的 subscriber-local-prioritysubscriber-network-priority 属性指定。

网络 DTO 优先级订阅标志目前被 Solace JNDI 忽略。它们保留用于未来发展。

“仅传递给一个”功能不支持持久化消费者或使用保证传输的非持久化消费者。这些消费者始终使用“仅传递给一个”的覆盖功能进行连接。