【问题标题】:ActiveMQ ArtemisActiveMQ 阿尔忒弥斯
【发布时间】:2019-05-05 07:27:33
【问题描述】:

我正在尝试实现 ActiveMQ Artemis。 Artemis 是 ActiveMQ 的一部分吗?

我正在尝试执行定期任务delay-and-schedule-message-delivery ActiveMQ,但唯一有效的是延迟scheduled-messages。文档中有关于核心API的说明:

还可以使用核心 API 发送预定消息,方法是在发送前在核心消息上设置相同的属性。

所以这可能并不意味着我可以设置 ActiveMQ 属性。

我需要任何具有这些功能的消息队列:

  1. 重复任务(ActiveMQ“经典”)
  2. 重复任务检测 (ActiveMQ Artemis)
  3. 数据持久性
  4. 消息修改 - 从队列中删除或更改重复延迟
  5. 弹簧集成

【问题讨论】:

  • “重复任务”是什么意思?消息代理不能替代cron
  • 我需要一些服务,我将在其中存储许多简单的任务(数千、数百万),我需要定期运行的每个任务(5s、1m、5m 等)。这些任务将在分布式环境中运行,我们将在其中等待消息的工作人员。 Cron 在这个问题上没用,因为我们需要更离散地调度任务(以秒为单位进行计划)。
  • 另外,我不想在完成工作后将每个任务都添加到队列中(重新调度),因为大多数任务会以静态周期重复,并且存在潜在风险,该任务不会被重新安排(任务失败,服务断开......)。我认为我可以使用这样的东西:activemq.apache.org/delay-and-schedule-message-delivery.html
  • 我根据您的回复更新了我的答案。
  • 谢谢。我们将尝试仅使用石英调度程序而不是任何队列。

标签: scheduled-tasks activemq-artemis


【解决方案1】:

Apache ActiveMQ Artemis 是一个消息代理,它是 ActiveMQ 项目的一部分。但是,它与“经典”的 ActiveMQ 代理代码库是分开的。它基于更新的、基本无阻塞的设计,并且支持所有协议和大部分与 ActiveMQ 5.x 相同的功能。 ActiveMQ 社区目前的目标是 Artemis 将成为 ActiveMQ 的 6.x 版本。

  1. 重复任务(ActiveMQ“经典”)

可以使用预定递送,但这仅适用于单条消息。一旦该消息被传递和使用,它就消失了,这意味着您需要发送另一条预定的消息。不会自动重复发送相同的消息。

quartz scheduler 之类的东西在这里可能是一个很好的解决方案,因为您可以使用它安排所有任务,并且计划的任务可以将消息发送到由分布式工作人员监控的队列。通过这种方式,您可以将日程安排与工作分配分开。

  1. 重复任务检测 (ActiveMQ Artemis)

Artemis 支持称为“最后值队列”的东西,您可以在其中将消息的特殊属性设置为特定值(例如任务 ID),并且每当您向队列发送具有相同值的消息时,它都会 用您发送的消息替换现有消息。换句话说,它始终具有您发送的 last 值。您可以在Artemis documentation on last-value queues 中阅读更多相关信息。

还有经典的重复检测,您可以在其中为消息设置重复 ID,如果代理看到重复的重复 ID,它将丢弃具有重复重复 ID 的消息。您可以在Artemis documentation on duplicated detection 中阅读更多相关信息。

  1. 数据持久性

默认情况下,任何标记为durable(或JMS 术语中的persistent)的消息发送到持久队列(默认情况下队列是持久的)都将持久保存到磁盘。

  1. 消息修改 - 从队列中删除或更改重复延迟

队列上的消息是不可变的,因此您无法从技术上对其进行编辑,但您可以使用最后值队列的语义来获得类似的行为(例如,发送具有相同最后值属性的修改消息,它将替换现有消息)。

  1. 弹簧集成

ActiveMQ Artemis 是一个 JMS 实现,因此 Spring 中可用的所有 JMS 集成类都可以正常工作。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 2020-07-21
    • 2016-08-23
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多