跳到主要内容

使用本地事务

本节描述了如何使用事务性会话来发布和/或接收一系列保证消息(Guaranteed messages),这些操作作为一个单一的原子单元,称为本地事务。本地事务仅依赖于单一资源(事件代理)来为消息客户端提供服务。

本地事务可以由使用 Java RTO、C、.NET、JMS 或 Python 消息 API 的客户端使用。本节仅讨论 Java RTO、C 和 .NET API。有关使用事务性会话与 Solace JMS 实现的信息,请参阅“使用事务性会话”。有关使用事务性会话与 Solace Python 实现的信息,请参阅“使用 Python API 中的本地事务”。

事务性会话允许客户端应用程序将多个保证消息的发送和/或接收操作组合在一起,作为一个单一的原子单元,即事务。只有保证消息(即具有持久或非持久传输模式的消息)可以通过事务进行发布或接收;直接消息(Direct messages)不能用于事务。

要以事务方式发布和/或消费消息,客户端应用程序必须在一个会话内创建一个事务性会话。然后,在该事务性会话中,客户端应用程序可以建立一个生产者流(即发布者流)以在事务中发布消息,和/或建立一个消费者流(即订阅者流)以在事务中接收消息。尽管管理员可以修改此值,但默认情况下,客户端可以在单个事务中发布和/或消费最多 256 条保证消息的组合。有关更多信息,请参阅“配置每事务的最大消息数”。

在事务中发布和接收的消息会被暂存到事件代理上。要完成事务中的所有消息发送和接收操作,必须提交事务。或者,事务也可以回滚,从而取消其所有发布和接收操作。一旦事务完成,另一个事务将自动开始。

下图展示了客户端如何在单个事务性会话中同时使用生产者和消费者。在这种情况下,当客户端提交事务时,消费者从端点接收暂存的消息 A,同时消息 B 和 C 被发布到同一个目标端点。

img

有关如何使用本地事务的示例,请参阅相应消息 API 的 Transactions 示例。


线程考虑事项

事务性会话仅支持单线程使用(但任何应用程序线程都可以调用 close()destroy() 来关闭事务性会话)。事务性会话中的所有生产者和消费者流必须由同一线程顺序访问。

同步消费者

当使用同步消息消费者时,发送和接收操作由单个应用程序线程完成,该线程必须提交或回滚事务。应用程序线程对事务性会话的生产者和消费者进行序列化访问。

异步消费者

当使用异步消息消费者时,API 所有的线程会将消息传递给注册的消息监听器。该线程用于发送消息,且该线程必须提交或回滚事务。API 线程对事务性会话的生产者和消费者进行序列化访问。