【问题标题】:Push Notification with websocket and activemq spring-boot message broker使用 websocket 和 activemq spring-boot 消息代理推送通知
【发布时间】:2018-01-29 19:37:38
【问题描述】:

我们正在考虑为我们的 UI 实现推送通知系统(在 Angular 上实现),我们正在考虑使用 websocket 与配置了 activeMQ 的 spring-boot 消息代理进行通信。

我们能够实现这一点,但有两个棘手的部分我们不知道如何实现:

  • 我们不希望消息在被消费后从队列中删除,在我们的例子中,用户将看到通知列表,如果用户当时点击其中一个,我们认为他/她已阅读通知,我们可以将其从队列中删除,但只要他没有点击通知,他/她每次登录系统时仍然会看到它。
  • 我不想以数千个队列告终,我需要某种机制来删除所有已空 1 天的队列。

感谢您对这些观点的任何意见。

谢谢, 奥马尔

【问题讨论】:

  • 感谢 Hassen,我们已经在下面尝试了您的解决方案并且效果很好
  • 太棒了;)您的“我们的 UI 的推送通知系统(在 Angular 上实现)”是您的代码还是现有的库?我对此很感兴趣。谢谢
  • Hi Hassen,这是我们对 UI 部分的实现

标签: spring-boot websocket activemq


【解决方案1】:
  1. 我们不希望消息一旦被从队列中删除 消费,在我们的例子中,用户将看到通知列表,如果 用户点击其中一个,我们认为他/她 已阅读通知,我们可以将其从队列中删除,但是 只要他不点击通知,他仍然会看到它 每次他/她登录系统。

一种解决方案是使用不同的队列来存储每个用户的通知。

在该队列上创建一个使用 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 作为确认模式的消费者,以便在用户连接时将其显示给用户。

如果你使用 STOMP http://activemq.apache.org/stomp.html#Stomp-ActiveMQExtensionstoSTOMP

stomp 命令订阅 http://stomp.github.io/stomp-specification-1.1.html#SUBSCRIBE

ack头控制消息的确认方式。

SUBSCRIBE ack Header
The valid values for the ack header are auto, client, or **client-individual**. If the header is not set, it defaults to auto.

当用户点击通知时,您调用ActiveMQMessage.acknowledge(); 或 stomp 命令 ACK http://stomp.github.io/stomp-specification-1.1.html#ACK

  1. 我不想以成千上万的队列结束我需要某种 删除所有队列的机制已经空了 1 天。

只需使用: http://activemq.apache.org/delete-inactive-destinations.html

非活动目的地“非活动”目的地是指没有 消息未决,并且在某些配置的时间段内没有连接消费者 的时间。默认情况下,代理不检查非活动状态 目的地。这受以下默认值的约束 选项: schedulePeriodForDestinationPurge="0" 和 gcInactiveDestinations="假"。但是,可以配置代理 清除不活动的目的地。为此需要专门使用 结合代理配置的目标策略条目 属性:schedulePeriodForDestinationPurge > 0。

例子:

<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="10000">

  <destinationPolicy>
     <policyMap>
        <policyEntries>
           <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="30000"/>
        </policyEntries>
     </policyMap>
  </destinationPolicy>

</broker>

在此示例中,代理将每 10 秒检查一次非活动目的地,具体由下式确定 schedulePeriodForDestinationPurge="10000"。当目标清除是 触发代理将删除任何已为空的队列 长于 inactiveTimoutBeforeGC="30000" 毫秒(默认值: 60000 毫秒)并且设置了 gcInactiveDestinations="true" 在其相应的目标策略条目上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多