跳到主要内容

在PubSub+ JCSMP API中发送保证消息

当发送保证消息时,使用 PubSub+ JCSMP API 的客户端应用程序必须考虑以下因素:

  • 是否希望以流式或非流式模式发送消息。请参阅 PubSub+ JCSMP API 中的流式和非流式发送。
  • 每次发送调用要发布的消息数量。请参阅一次发送一条消息或一次发送多条消息。
  • 是否希望发送需要接收方回复的消息。请参阅在 PubSub+ JCSMP API 中发布请求回复的消息。
  • 如果您在经历比平时更高的延迟的网络环境中发布消息,您可能需要调整保证消息发布窗口大小(请参阅调整保证消息发布窗口大小)或确认计时器(请参阅调整保证消息发布确认计时器)。

有关如何发布和接收保证消息的示例,请参阅 Solace 开发者中心中的 simpleFlowToQueue 示例。

PubSub+ JCSMP API中的流式和非流式发送

PubSub+ JCSMP API 仅支持阻塞式网络 I/O 模型。但是,当发布消息时,JCSMP API 可以使用一个发布事件处理器,该处理器以流式或非流式模式运行。发布事件处理器使用的模式是在获取 XMLMessageProducer 时设置的。

要使用 PubSub+ JCSMP API 发布消息,客户端必须从 JCSMPSession 获取一个 XMLMessageProducer。获取后,JCSMPSession 将维护与事件代理的连接,应用程序随后可以发送消息。

XMLMessageProducer 也可以通过生产者接口创建会话相关消息(请参阅消息所有权)。

直到在 XMLMessageProducer 上调用 close() 方法之前,XMLMessageProducer 始终处于“打开”状态。

客户端应该缓存获取的实例,并且仅在不再需要时关闭它。为每条发送的消息获取一个新的 XMLMessageProducer 实例是低效的。

要获取 XMLMessageProducer 实例,请调用 getMessageProducer(JCSMPStreamingPublishEventHandler callback) 并设置回调处理器。当传入的 JCSMPStreamingPublishEventHandler 参数实例非空时,发送操作将使用 JCSMPStreamingPublishEventHandler 通过回调机制异步获取消息投递失败的确认。

发送大于事件代理最大消息大小的消息

您不能发布大于事件代理最大保证消息大小的保证消息 — 在大多数情况下为 30MB。如果尝试发布超过最大大小的消息,PubSub+ JCSMP API 将抛出一个带有子代码 MESSAGE_TOO_LARGE 的异常。为了防止中断,请设计您的应用程序以控制消息大小并确保它们保持在支持的限制内。

调整保证消息发布窗口大小

如果需要,可以调整保证消息发布窗口大小,以更好地适应您的消息传递环境。有效范围是 1 到 255。

尽管默认值已被证明在大多数局域网情况下可以提供良好的性能,但在消息通过广域网或延迟较高的网络(可能会产生事件代理/交换机引起的延迟)发布,并且窗口遇到流量控制情况时,增加该值可能会有所帮助。

对于直接消息,窗口确认属性无效。

要设置保证消息发布窗口大小,请使用 JCSMPProperties.PUB_ACK_WINDOW_SIZE 属性:

JCSMPProperties properties = new JCSMPProperties();
properties.setProperty(JCSMPProperties.PUB_ACK_WINDOW_SIZE, 255);

调整保证消息发布确认计时器

保证消息发布确认计时器设置发布 API 在重新发送之前等待来自事件代理的确认的时间量(以毫秒为单位)。在发布确认时间内未被确认的保证消息将由 API 自动重传。

尽管默认的保证消息发布确认计时器值已被证明可以提供良好的性能,但如有必要,可以进行调整。

对于直接消息,窗口确认属性无效。

要调整保证消息发布确认计时器,请使用 JCSMPProperties.PUB_ACK_TIME

JCSMPProperties properties = new JCSMPProperties();
properties.setProperty(JCSMPProperties.PUB_ACK_TIME, 2500);

一次发送一条消息

要通过 API 调用发布单条消息,请调用 XMLMessageProducer.send(...) 方法:

producer.send(message, JCSMPFactory.onlyInstance().createTopic(topicString));

当使用 JCSMP 并且发送由生产者创建的消息(即会话相关消息)时,请确保客户端:

  • 不要多次发送相同的消息。尝试这样做会抛出 InvalidOperationException
  • 不要发送在之前的 JCSMPSession 中创建的或者由另一个 XMLMessageProducer 创建的 Message 实例。尝试这样做会抛出 IllegalArgumentException
  • 在完成发布后调用 close() 关闭生产者。任何进一步的访问,例如发送消息,都会引发异常。

一次发送多条消息

可以通过单个 API 调用发送一组直接或保证消息。这允许以批处理或向量的方式发送消息。要发送的消息以数组形式指定;一次调用最多可以发送五十条消息。

当通过发送多条消息的 API 调用批量发送消息时,所有消息应设置相同的传递模式(例如,直接或持久)(请参阅传递模式)。

在 PubSub+ JCSMP API 中,必须传入一个 {Message, Destination} 对的数组,每个由 JCSMPSendMultipleEntry 实例表示。这种配对允许将消息发送到各个目的地。每条消息都必须是应用程序拥有的消息实例(即,通过 JCSMPFactory.createMessage(...) 获取)。

PubSub+ JCSMP API 尝试一次性将所有消息写入网络,并在完成后阻塞。

当发送保证消息时,消息是按顺序传输的。

要发布一组消息,请使用 XMLMessageProducer.sendMultiple(...) 方法。

有关更多信息,请参阅 PubSub+ JCSMP 消息传递 API 参考。

消息相关性

当使用保证消息传递时,相关性键或标签用于将消息与其确认或拒绝确认相关联。对于 PubSub+ JCSMP API,相关性键是一个在事件代理确认或拒绝确认期间返回给客户端的对象。

要为消息设置相关性键:

  • msg.setCorrelationKey(...)

相关性键通过以下方式返回给客户端:

  • JCSMPStreamingPublishCorrelatingEventhandler.responseReceivedEx()(用于确认)
  • JCSMPStreamingPublishCorrelatingEventhandler.handleErrorEx()(用于拒绝确认)

有关如何使用相关性键的示例,请参阅 Solace 开发者中心中的 adPubAck 示例。