跳到主要内容

发送保证消息

在发送保证消息时,客户端应用程序必须考虑以下因素:

  • 使用 JCSMP 时,是否希望以流式或非流式模式发送消息。请参阅 JCSMP 中的流式和非流式发送。
  • 使用 Java RTO、C 或 .NET API 时,是否希望以阻塞或非阻塞模式发送消息。请参阅 Java RTO、C 和 .NET API 中的阻塞和非阻塞网络 I/O。
  • 每次发送调用要发布的消息数量。请参阅逐条发送消息或一次性发送多条消息。
  • 是否希望发送需要接收方回复的消息。请参阅发布需要回复的消息。
  • 如果您处于网络延迟较高的环境中,可能需要调整保证消息发布窗口大小(请参阅调整保证消息发布窗口大小)或确认计时器(请参阅调整保证消息发布确认计时器)。

相关示例

有关如何发布和接收保证消息的示例,请参考 Java、Java RTO、C 和 .NET API 的 simpleFlowToQueue 示例,以及 JavaScript 和 Node.js API 的 QueueProducer 示例。

JCSMP 中的流式和非流式发送

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

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

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

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

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

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

Java RTO、C和.NET API中的阻塞和非阻塞网络I/O

Java RTO、C 和 .NET API 可以使用阻塞或非阻塞网络 I/O 模型进行发送操作。这由发送阻塞会话属性控制。默认情况下,此属性设置为 trueENABLE,即使用阻塞模式。

当发送阻塞会话属性设置为 falseDISABLE 时,使用非阻塞模式。如果操作系统/网络无法在不阻塞调用线程(直到有更多缓冲区空间可用)的情况下发送完整消息,客户端应用程序将收到 WOULD_BLOCK 返回码。当收到 WOULD_BLOCK 返回码时,消息未发送,客户端应用程序必须等待 CAN_SEND 会话事件,该事件表明网络已准备好进行发送。

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

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

尽管默认值已被证明在大多数局域网环境中性能良好,但在通过广域网或延迟较高的网络(可能会导致事件代理/交换机引入延迟)发布消息时,增加该值可能会有所帮助,尤其是在窗口遇到流量控制情况时。

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

PubSub+ 消息 API使用方法
JCSMPJCSMPProperties#PUB_ACK_WINDOW_SIZE
Java RTOSessionHandle.PROPERTIES.PUB_WINDOW_SIZE
CSOLCLIENT_SESSION_PROP_PUB_WINDOW_SIZE
.NETSessionProperties.ADPublishWindowSize
JavaScript 和 Node.jssolace.MessagePublisherProperties.windowSize
其中 solace.MessagePublisherProperties 对象被赋值给 solace.SessionProperties.publisherProperties

如何设置保证消息发布窗口大小

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

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

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

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

PubSub+ 消息 API使用方法
JCSMPJCSMPProperties#PUB_ACK_TIME
Java RTOSessionHandle.PROPERTIES.PUB_ACK_TIMER
CSOLCLIENT_SESSION_PROP_PUB_ACK_TIMER
.NETSessionProperties.ADPublishAckTimerInMsecs
JavaScript 和 Node.jssolace.MessagePublisherProperties.acknowledgeTimeoutInMsecs
其中 solace.MessagePublisherProperties 对象被赋值给 solace.SessionProperties.publisherProperties

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

逐条发送消息

要通过 API 调用发布单条消息,请调用以下列出的发送方法或函数之一。

PubSub+ 消息 API使用方法
JCSMPXMLMessageProducer.send(...)
Java RTOSessionHandle.send(...)
CsolClient_session_sendMsg(...)
.NETISession.Send(...)
JavaScript 和 Node.jssolace.Session.send(...)

如何发送消息

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

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

一次性发送多条消息

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

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

JCSMP

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

JCSMP 尝试一次性将所有消息写入网络,并阻塞直到完成。

Java RTO、C、JavaScript、Node.js 和 .NET API

当使用 Java RTO、C、JavaScript、Node.js 或 .NET API 时,必须传入一个消息数组。与 JCSMP 不同,消息目标不是通过发送方法设置的,而是作为每条消息的属性设置的。

当通过会话属性为会话配置阻塞模式时,调用将阻塞,直到消息 API 可以接受所有消息。如果配置为非阻塞模式,并且 API 无法接受所有要发布的消息,则返回 SOLCLIENT_WOULD_BLOCK,并且已接受的消息数量将通过 in_out_howManySentnumberOfMessagesWrittenmessagesSent 参数返回。应用程序可以选择重新尝试发送未被接受的消息,或者采取其他操作。

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

PubSub+ 消息 API使用方法
JCSMPXMLMessageProducer.sendMultiple(...)
Java RTOSessionHandle.send(...)
CsolClient_session_sendMultipleMsg(...)
.NETISession.Send(...)
JavaScript 和 Node.js不适用

如何发布一组消息

相关示例

有关如何发布一组消息的示例,请参考适用于相应消息 API 的 PerfTest 示例。

消息相关性

在使用保证消息时,相关性键或标签用于将消息与其 ACK 或 NACK 关联。对于 JCSMP、Java RTO 和 .NET API,相关性键是一个对象,在事件代理确认(ACK)或拒绝(NACK)时返回给客户端。对于 C API,相关性标签是一个指针,在事件代理确认(ACK)或拒绝(NACK)时返回给客户端。

PubSub+ 消息 API使用方法
JCSMP要为消息设置相关性键:
  • msg.setCorrelationKey(...)
    相关性键通过以下方式返回给客户端:
  • JCSMPStreamingPublishCorrelatingEventhandler.responseReceivedEx()(用于 ACK)
  • JCSMPStreamingPublishCorrelatingEventhandler.handleErrorEx()(用于 NACK) | | Java RTO | 要为消息设置相关性键:
  • MessageHandle.setCorrelationKey(...)
    相关性键通过以下会话事件返回给客户端:
  • ACKNOWLEDGEMENT
  • REJECTED_MSG_ERROR | | C | 要为消息设置相关性标签:
  • solClient_msg_setCorrelationTagPtr(...)
    相关性标签在以下会话事件的回调中返回给客户端:
  • SOLCLIENT_SESSION_EVENT_ACKNOWLEDGEMENT
  • SOLCLIENT_SESSION_EVENT_REJECTED_MSG_ERROR | | .NET | 要设置消息的相关性键属性:
  • message.CorrelationKey = myCorrelationKey;
    相关性键在以下事件的 HandleSessionEvent 回调中返回给客户端:
  • Session.Acknowledgement
  • Session.RejectedMessageError | | JavaScript 和 Node.js | 要设置消息的相关性键属性:
  • message.setCorrelationKey(...)
    相关性键在以下事件的监听器中返回给客户端:
  • solace.SessionEventCode.ACKNOWLEDGED_MESSAGE
  • solace.SessionEventCode.REJECTED_MESSAGE_ERROR |

如何使用相关性键

相关示例

有关如何使用相关性键的示例,请参考适用于相应消息 API 的 adPubAck 示例。

对于 JavaScript 和 Node.js API,请参考 ConfirmedPublish 示例。