跳到主要内容

使用PubSub+ Go API配置和取消配置队列

在 PubSub+ 事件代理上配置持久队列有两种方法:

  • 管理员可以通过 Broker Manager、SEMP、Solace CLI 或 SolAdmin 手动配置持久队列。
  • 在已连接的 MessagingService 中,客户端可以通过 PubSub+ Go API 动态配置持久队列。

要动态配置或取消配置持久队列,请参阅以下部分:

  • 配置持久队列
  • 取消配置持久队列

还可以使用缺失资源创建策略来配置持久和非持久队列。有关更多信息,请参阅使用缺失资源创建策略配置持久和非持久队列。

配置持久队列

以下步骤展示了如何创建持久队列的 API 表示,并在事件代理上配置它:

  • 使用 EndpointProvisioner 接口的方法设置队列属性。未配置的属性将设置为事件代理的默认值。
provisioner := messagingService.EndpointProvisioner().
WithMaxMessageRedelivery(10). // 队列消息在移动到 DMQ 之前将重新投递的次数
WithDiscardNotification(true). // 将通知发送者关于消息丢弃的信息
WithTTLPolicy(true). // 在队列上尊重消息 TTL
WithQuotaMB(100). // 设置队列消息配额(以 MB 为单位)
WithMaxMessageSize(1000000). // 设置最大消息大小(以字节为单位)
WithExclusiveAccess(true). // 配置一个独占队列
WithPermission(config.EndpointPermissionDelete) // 配置删除权限
// 有关属性的完整列表,请参阅 Go 的 PubSub+ 消息 API 参考中的 EndPointProvisioner 接口

您可以在事件代理上配置多个具有不同名称的队列,但它们都将共享使用 EndpointProvisioner 实例设置的相同属性。

有三种方法可以用来配置持久队列。所有配置方法都接受一个参数 ignoreExists,这是一个布尔值,如果设置为:

  • true — 如果事件代理上已经存在具有相同名称和属性的队列,则该方法不会返回错误。
  • false — 如果事件代理上已经存在具有相同名称和属性的队列,则该方法会返回错误。
  1. 同步方法 — 调用 Provision() 方法并传入队列名称。Provision() 会阻塞应用程序的执行,直到队列在事件代理上配置完成:
var outcome solace.ProvisionOutcome
outcome = provisioner.Provision("queueName", false)

fmt.Println("在事件代理上配置队列 [状态]: ", outcome.GetStatus())
fmt.Println("在事件代理上配置队列 [错误]: ", outcome.GetError())
  1. 异步方法(使用通道) — 调用 ProvisionAsync() 方法并传入队列名称。ProvisionAsync() 立即返回一个通道,该通道最终会产生配置结果:
outcomeChannel := provisioner.ProvisionAsync("queueName", false)

outcome := <-outcomeChannel
fmt.Println("在事件代理上异步配置队列 [状态]: ", outcome.GetStatus())
fmt.Println("在事件代理上异步配置队列 [错误]: ", outcome.GetError())
  1. 异步方法(使用回调处理器) — 调用 ProvisionAsyncWithCallback() 方法并传入队列名称和回调处理器。ProvisionAsyncWithCallback() 使用回调处理器而不是通道来通知应用程序配置结果:
provisionCallbackHandler := func(outcome solace.ProvisionOutcome) {
fmt.Println("在事件代理上异步配置队列(带回调) [状态]: ", outcome.GetStatus())
fmt.Println("在事件代理上异步配置队列(带回调) [错误]: ", outcome.GetError())
}

provisioner.ProvisionAsyncWithCallback("queueName", false, provisionCallbackHandler)

取消配置持久队列

从事件代理取消配置持久队列有两种方法:

  • 管理员可以通过 Broker Manager、Solace CLI、SEMP 或 SolAdmin 在事件代理上移除持久队列。
  • 客户端应用程序可以使用以下列出的方法,并以队列名称作为参数,移除之前使用 PubSub+ Go API 配置的持久队列。

只有队列的所有者(即最初配置队列的客户端)或者具有删除权限级别的队列(允许其他客户端移除队列)的客户端可以移除队列(参阅定义端点属性)。

通过管理界面(Broker Manager、SolAdmin、CLI 或 SEMP)创建的队列只能由管理进行取消配置和删除。也就是说,如果队列是由管理创建的,那么不能通过客户端使用 API 来取消配置,无论配置的权限如何。

以下步骤展示了三种取消配置持久队列的方法。所有取消配置方法都包含一个参数 ignoreMissing,这是一个布尔值,如果设置为:

  • true — 如果在事件代理上未找到匹配的队列,则该方法不会返回错误。
  • false — 如果在事件代理上未找到匹配的队列,则该方法会返回错误。
  1. 同步方法 — 调用 Deprovision() 方法,该方法从事件代理取消配置具有给定名称的队列,并阻塞应用程序直到方法返回:
deprovError := messagingService.EndpointProvisioner().Deprovision("queueName", false)
fmt.Println("在事件代理上取消配置队列 [错误]: ", deprovError)
  1. 异步方法(使用通道) — 调用 DeprovisionAsync() 方法,该方法从事件代理取消配置具有给定名称的队列,并立即返回一个通道,该通道最终会产生取消配置结果:
errorChannel := messagingService.EndpointProvisioner().DeprovisionAsync("queueName", false)
deprovError := <-errorChannel
fmt.Println("在事件代理上异步取消配置队列 [错误]: ", deprovError)
  1. 异步方法(使用回调处理器) — 调用 DeprovisionAsyncWithCallback() 方法,该方法从事件代理取消配置具有给定名称的队列,并使用回调处理器而不是通道来通知应用程序取消配置结果:
deprovisionCallbackHandler := func(deprovError error) {
fmt.Println("在事件代理上异步取消配置队列(带回调) [错误]: ", deprovError)
}
messagingService.EndpointProvisioner().DeprovisionAsyncWithCallback("queueName", false, deprovisionCallbackHandler)

使用缺失资源创建策略配置持久和非持久队列

可以使用缺失资源创建策略在 Solace 事件代理上配置队列。这些队列可以是持久的或非持久的(参阅我们的博客文章了解 Solace 端点:持久与非持久),并且直到您在 PersistentMessageReceiver 上调用 Start() 时,才会在事件代理上配置这些队列。

创建非持久队列

要创建非持久队列,请在构建 PersistentMessageReceiver 时将 resource.QueueNonDurableExclusive(queueName) 作为参数传递给 Build() 函数。当您在 PersistentMessageReceiver 上调用 Start() 函数时,队列会在事件代理上配置。当创建队列的客户端应用程序从事件代理断开连接后,该非持久队列将被删除。以下示例展示了如何创建非持久队列:

nonDurableExclusiveQueue := resource.QueueNonDurableExclusive("queueName")  // 创建一个具有指定名称的独占、非持久队列的引用
topic := resource.TopicSubscriptionOf(topicString) // 创建指定主题字符串的 TopicSubscription

// 创建一个 PersistentMessageReceiverBuilder 实例,用于创建 PersistentMessageReceivers。
persistentReceiver, err := messagingService.CreatePersistentMessageReceiverBuilder().
WithSubscriptions(topic). // 设置启动接收器时要订阅的主题订阅列表。
Build(nonDurableExclusiveQueue) // 如果队列为空,则返回 *IllegalArgumentError。

如果客户端意外断开连接,例如由于网络问题,队列将在 60 秒后被删除。这允许自动重新连接逻辑在队列消失之前重新将客户端连接到队列。

创建持久队列

要创建持久队列,请在构建 PersistentMessageReceiver 时调用 WithMissingResourcesCreationStrategy() 函数。MissingResourcesCreationStrategy 接受一个参数,该参数有两个可能的值:

  • config.MissingResourcesCreationStrategy(config.PersistentReceiverDoNotCreateMissingResources) — 默认值,禁用创建缺失资源的任何尝试。

  • config.MissingResourcesCreationStrategy(config.PersistentReceiverCreateOnStartMissingResources) — 只要客户端具有足够的权限(否则会抛出异常),就会创建 Build() 函数中提供的队列。

当您在 PersistentMessageReceiver 上调用 Start() 函数时,队列会在事件代理上配置。

以下示例展示了如何使用缺失资源创建策略创建持久队列:

durableExclusiveQueue := resource.QueueDurableExclusive("queueName")        // 创建一个具有指定名称的独占、持久队列
topic := resource.TopicSubscriptionOf(topicString) // 创建指定主题字符串的 TopicSubscription
strategy := config.MissingResourcesCreationStrategy(config.PersistentReceiverCreateOnStartMissingResources) // 表示发布者需要保证资源时可用的各种缺失资源创建策略

// 创建一个 PersistentMessageReceiverBuilder 实例,用于创建 PersistentMessageReceivers。
persistentReceiver, err := messagingService.CreatePersistentMessageReceiverBuilder().
WithMissingResourcesCreationStrategy(strategy). // 定义当检测到缺失资源时 API 可以采取的操作。
WithSubscriptions(topic). // 设置启动接收器时要订阅的主题订阅列表。
Build(durableExclusiveQueue) // 如果队列为空,则返回 *IllegalArgumentError。

可以为 PubSub+ 事件代理配置队列模板,这允许您为使用 Go API 创建的队列设置自定义属性。当使用缺失资源创建策略时,只有当您创建的队列名称与模板 name-filter 匹配时,队列模板才会覆盖提供的队列属性。有关队列模板的信息以及如何使用 Solace CLI 配置队列模板的说明,请分别参阅队列和主题端点以及配置端点模板。

要取消配置使用缺失资源创建策略创建的队列,请使用 SEMP、SolacePubSub+ 事件代理命令行界面(CLI)或在取消配置持久队列中列出的取消配置方法之一。