我有一个要求,我目前不知道它是否可能。如果消息包含指定的属性,我想暂时禁用 JMS 消息的开发。目前我使用 HornetQ 作为消息提供者。
让我们举个例子:
该队列包含以下三个条目:
{1, "foo", "A_CATEGORY"}
{2, "bar", "B_CATEGORY"}
{9, "bof", "A_CATEGORY"}
在某个时刻,应用程序必须能够告诉 HornetQ 消息服务器,此时不应传递属于 B_CATEGORY 的消息(例如,因为 B_CATEGORY 对象的底层数据库已更新)。因此,id 为 2 的消息目前不会被传递,而 1 和 9 将被传递,因为它们对于类别对象具有不同的值。
它必须发生在 Java 代码之外,根本不需要重新启动应用程序。这可能吗?
谢谢你的帮助!
刚刚想到了解决这个问题的另一种设计方法。让我们假设第一个 Queue 包含具有各种类别的消息(顺便说一句,不可能为每个类别创建一个队列,因为它们可能很多)。这个“正常”队列是正常配置的(例如,没有过期,但是 DLQ)。
现在,如果侦听器使用这样的消息并发现它无法处理属于某个类别的消息,它会将其放入第二个队列。此队列配置了重新传递延迟和到期时间。如果现在将到期时间设置得足够高(当然不是队列溢出)并且重新传递时间不太短,那么如果上述问题没有解决方案,这应该可以解决。
当然,必须计算在无法处理类别期间可以创建多少这些队列条目。还有一个类别的这种不可用可能需要多长时间,以便可以相应地调整重新交付。