【问题标题】:When using Spring Boot and STOMP, is there a way to make queues not delete messages?使用 Spring Boot 和 STOMP 时,有没有办法让队列不删除消息?
【发布时间】:2021-06-09 01:02:04
【问题描述】:

我有一个应用程序,它在后端使用 Java,在前端使用 Angular,我正在尝试在两者之间使用 STOMP 消息传递来交换状态数据。

我想做的是让我的服务在启动时发布它们的状态,并将该数据保留在队列中以供以后连接到服务器的任何客户端使用。

(编辑)

为了澄清,我并不是说我希望消息在服务器重新启动后仍然存在。我想要的是某些消息队列保留所有消息,直到服务器重新启动。

如何告诉 Spring Boot 的 STOMP 实现不要删除 /queue 的内容?

【问题讨论】:

  • 一般来说,消息传递中的“持久”一词具有预先存在的含义。 “持久”消息是“将在重新启动后仍然存在”的消息。您所说的更像是一个非破坏性队列,其中确认实际上不会删除消息。这是 Spring 的内部 STOMP 代理不太可能支持的高级用例。但是,它将由 ActiveMQ Artemis 等外部代理支持。
  • 听起来您想要一个拥有持久订阅者的主题。这是发布/订阅主题将保存每条消息的地方,直到所有注册的订阅者都收到它。 This 问题可能会有所帮助。
  • 你说得对,@JustinBertram,我弄错了我的问题。我现在正在解决这个问题。
  • 如果你沉迷于 STOMP 客户端/服务器消息传递,那么总是存在请求-回复模型,客户端订阅回复队列并为它发送到的请求设置回复对象服务器。然后,服务器将使用一些缓存的状态信息(来自一些与消息无关的数据结构)响应请求队列上的消息,并将其发送到回复队列。
  • @HopeyOne,正如我在第一条评论中所述,ActiveMQ Artemis(可以与 Spring 集成以充当 STOMP 代理)是否通过以下方式支持这种用例"non-destructive" queue.

标签: java angular spring spring-boot stomp


【解决方案1】:

您可以将ActiveMQ Artemis 配置为"external broker" 并使用"non-destructive" queue。当 STOMP 客户端接收并确认来自非破坏性队列的消息时,代理将不会将其删除。您可以定义一个特殊的“初始化”队列,所有客户端最初都连接到该队列以接收您关心的状态数据,然后他们可以连接到完成正常工作所需的任何其他队列。

在这种用例中,队列通常配置为非破坏性"last value" queue。这样,每个客户端都可以使用自己的“最后一个值”,并且可以保持其状态数据是最新的,而不会导致队列中的陈旧状态数据变得复杂。

我知道您的问题是询问如何使用 Spring 的内置代理执行此操作,但我所有的研究表明,Spring 的简单内存代理既不支持最后值队列语义,也不支持非破坏性队列语义,甚至不支持持久消息.据我了解,Spring 的代理仅适用于最基本的用例,这就是为什么要启用与可以支持更高级用例(例如您的)的 3rd 方代理的集成。

【讨论】:

  • 啊,但这似乎需要向应用程序添加一个外部实体。我希望有一种方法可以将 Spring 提供的内部代理配置为具有非破坏性队列。
  • 我认为它只是回答它,因为它暗示 Spring 的内置代理不使用最后值也不使用持久队列。如果您可以更新它以清楚地说明,那么我会将其标记为已回答。
  • 相应更新。谢谢!
猜你喜欢
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多