对于单元测试,我在同一 JVM 中运行多个 Ignite 节点(如答案 here 中所讨论)。
在我的单元测试中,我想模拟 Ignite 节点意外死亡时发生的情况,例如模拟突然的硬件故障及其对整个集群的影响。我不能只调用 Ignite.close() 因为这会 有序 关闭,我想要突然 无序 关闭,它可能带来所有问题。
我可以想到两种可能的方法来做到这一点:
当我在我的 JVM 中启动一个新的 ignite 节点时,以某种方式跟踪它产生的所有线程,然后在我想模拟它死亡时使用(已弃用的)方法 thread.stop 突然杀死它的所有线程。我看不到一种方法可以可靠地区分 JVM 中一个 Ignite 启动的线程与另一个 Ignite 启动的线程,除非我假设 Ignite 仅在启动时启动它的所有线程。
使用 Java 进程 API 启动一个单独的进程(参见第一个答案here),在该进程中启动点燃,然后使用 Process.destroy() 或 Process.destroyForcibly() 强制终止它。
有人知道更好的方法吗?
我正在使用 Java 8.
- 当我在我的 JVM 中启动一个新的 ignite 节点时,以某种方式跟踪它产生的所有线程,然后在我想模拟它死亡时使用(已弃用的)方法 thread.stop 突然杀死它的所有线程。我看不到一种方法可以可靠地区分 JVM 中一个 Ignite 启动的线程与另一个 Ignite 启动的线程,除非我假设 Ignite 仅在启动时启动它的所有线程。
如果您在集群节点拓扑更改期间测试您的应用程序行为,则没有必要使用私有 API 或 Ignite 的内部线程和类。 Ignite 测试框架中已经维护了此类测试。此外,还有基于 Ducktape 框架(IEP-56)的额外集成测试,它通过 Docker 在单独的 JVM 中运行 Ignite 节点。
我不完全确定你的情况,但看起来,你需要像Test Containers这样的东西。
例如,这样的代码下载Docker镜像并运行带有瘦客户端固定端口的Ignite节点(不幸的是,瘦客户端无法连接到临时端口):
FixedHostPortGenericContainer<?> ignite = new FixedHostPortGenericContainer<>("apacheignite/ignite")
.withFixedExposedPort(10800, 10800)
然后,调用
ignite.stop()
模拟意外的节点故障。