【问题标题】:How to cleanly close embedded ActiveMQ Artemis如何干净地关闭嵌入式 ActiveMQ Artemis
【发布时间】:2020-11-24 17:04:58
【问题描述】:

我是JavaLite 开源项目的维护者。其中一部分称为Async,它是Apache ActiveMQ Artemis 代理的简化前端。它的存在是为了让 Artemis 更容易嵌入到进程的内存中,也为处理“命令”增加了一层便利。我们已经在生产中使用了很多年,几乎没有出现任何问题。

但是,JavaLite 项目本身具有多次启动/停止代理的测试,并为不同的测试使用不同的实例。 Here's the source codeAsyncsource code of tests

如您所见,测试创建代理的一个新实例,使用它,然后停止它。

这是startstop 方法。

现在问题。通常,在我的笔记本电脑和较旧的 CI 环境中,构建运行测试都会成功,没有问题。我的笔记本电脑和以前的 CI 服务器从来没有遇到过任何问题。但是,我们正在构建一个新的 CI 服务器,并且该测试在那里失败并出现随机数量的逻辑错误(测试条件)。有时它也会成功。除了硬件之外,成功和失败的机器之间的一切都是相同的。失败的盒子只有两个 CPU 核心(我的笔记本电脑有 12 个核心)。

因此,在测试AsyncSpec 中,我们创建、启动和停止代理,似乎一些数据在代理的不同实例中随机流出。

在同一个 VM 中创建/启动/停止/销毁 Artemis 嵌入式服务器而不在多个实例之间发生冲突的最佳/最干净的方法是什么?

【问题讨论】:

  • @justin-bertram,刚刚订阅了邮件列表,让我们在那里进行对话。
  • @justin-bertram,很抱歉问这个问题,但我没有经常使用邮件板,我该如何问一个问题,我应该向 activemq.apache.org 的用户发送电子邮件吗?跨度>
  • @justin-bertram,我向 activemq.apache.org 的用户发送了电子邮件,并在那里添加了更多上下文。感谢任何帮助!
  • @justin-bertram,该电子邮件列表上的建议确实有所帮助,我解决了问题并进行了可重现的成功测试,感谢您的帮助!

标签: java activemq-artemis


【解决方案1】:

我将 JavaLite 加载到我的 IDE 中并重现了 AsyncSpec test you linked 的一些故障。这是我的观察...

我注意到的一件事是,您的某些测试可能会泄露代理。如果断言失败,则在代理停止之前具有断言的任何测试都可能泄漏,因为测试将在不停止代理的情况下终止。这将对随后的任何测试产生负面影响。您应该在 finally 块或 @After 方法中停止您的代理。在任何情况下,您都需要绝对确保无论测试中发生什么,代理都会停止。

您的测试也会泄露日志。您可以使用以下命令创建嵌入式代理的日志目录:

Files.createTempDirectory("async").toFile().getCanonicalPath();

但是,您永远不会清理该目录。我在一个循环中运行了数千次测试迭代,它占用了超过 200GB 的磁盘空间。

我认为最重要的是,当您在测试中发送消息时,您会将它们作为非持久性发送,这意味着它们将异步发送。但是,您的测试没有考虑到这一点,这可能会导致竞争条件并最终导致断言/测试失败。我看到几个选项来解决这个问题。您可以将消息作为持久发送,这将同步完成。您可以在嵌入式客户端的 URL 上设置blockOnNonDurableSend=true(在the documentation 中讨论),这也将使发送消息同步。或者您可以添加一些其他类型的Wait.waitFor() 以确保在继续测试之前满足有意义的条件(尽管在大多数测试中您将无法检查消息计数,因为您使用的是异步消息侦听器)。

我还认为,如果您在检查 HelloCommand.counter() 时使用 Wait.waitFor() 并且如果您在关闭代理之前这样做,那么您的测试会更加健壮。鉴于消息侦听器的异步特性,计数器的值和队列的消息计数可能会在短时间内出现差异。此外,在Wait.waitFor() 期间让代理保持运行状态将意味着消息侦听器不会过早停止。

当我第一次开始运行测试时,我可以在不到 25 次左右的时间内持续重现失败。通过上面列出的更改,我能够运行超过 12,000 次而没有失败。

目前我没有看到代理有任何问题,只是测试有问题。

【讨论】:

  • 该目录已清理。我偶然分享了此代码的链接。有问题的代码在 java8 分支上。尽管如此,您为我指出了正确的方向,并且我消除了所有潜在的竞争条件,这确实解决了问题。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多