跳到主要内容

在事务中消费消息

要在一个事务中消费保证消息(Guaranteed messages),客户端必须通过以下列出的方法或函数之一在事务性会话中创建一个消费者流,以绑定到暂存消息的目的地端点。

然后,可以通过消费者流从目的地端点接收消息,方式如下:

  • 异步方式:通过消息接收回调(对于 C API)或消息接收委托(对于 .NET API)。
  • 同步方式:通过单独的接收调用。以下列出了在事务中同步消费消息所需的调用。

事务性会话中的消费者与非事务性会话中的消费者功能相同,但它们接收到的消息只有在事务性会话成功提交后才会被确认,并从事件代理中移除。例如,调用 solClient_flow_sendAck()(对于 C API)对事务性会话没有影响。有关如何同步或异步接收保证消息的信息,请参阅“接收保证消息”。

对于 C 和 .NET API,创建消费者流时,它处于启动状态。可以通过流属性设置消费者流的启动/停止状态。

PubSub+ 消息 API调用方法
Java RTOTransactedSessionHandle.
createFlowForHandle(...)
CsolClient_transactedSession_createFlow(...)
.NETITransactedSession.CreateFlow(...)

如何在事务性会话中创建消费者流

PubSub+ 消息 API调用方法
Java RTOFlowHandle.receive(...) — 从指定的流中接收消息。API 会等待直到收到消息或达到指定的超时值。
CsolClient_flow_receiveMsg(...) — 从指定的流中接收消息。它会等待直到达到指定的超时值或收到消息。如果超时值为 0,则不等待。客户端应用程序必须稍后对收到的消息调用 solClient_msg_free() 以释放消息。
.NETITransactedSession.receive(...) — 从指定的流中接收消息。它会等待直到达到指定的超时值或收到消息。如果超时值为 0,则不等待。客户端应用程序必须稍后对收到的消息调用 Dispose() 以释放消息。

如何在事务中同步消费消息

在事务中消费消息后但在提交之前,如果发生以下情况,这些消息仍然可以成功提交:

  • 消息被管理操作从事件代理中移除(即消息从暂存区中删除)。
  • 消息的生存时间(TTL)已过期。(注意:提交操作是否成功与过期消息是否被移动到死信队列(DMQ)无关。)