【问题标题】:How to mock an offline Spring Boot application如何模拟离线 Spring Boot 应用程序
【发布时间】:2020-02-13 13:52:03
【问题描述】:

我有一个带端点的控制器。我想在运行时禁用这个端点,这样看起来应用程序对用户来说是离线的。

目前这样做是为了禁用端点:

private static final Map<RequestMappingInfo, HandlerMethod> requestMappings = new HashMap<>();

this.context.getHandlerMethods().forEach((k, v) -> {
    if (k.getPatternsCondition().getPatterns().contains("/customer")) {
      requestMappings.put(k, v);
    }
});
requestMappings.forEach((k, v) -> this.context.unregisterMapping(k));

这要启用:

requestMappings.forEach((k, v) -> this.context.registerMapping(k, v.getBean(), v.getMethod()));
requestMappings.clear();

这就像一个魅力,bean 在运行时未注册和注册。但是,当用户调用我的应用程序时,他们得到的是 404 而不是连接超时,这正是我所寻找的。

我明白为什么会收到 404。请求仍然进入应用程序,但找不到路径,因为 bean 没有注册,所以它返回 404。我该如何处理“实际离线”情况这根本不返回任何东西。

【问题讨论】:

  • 您对“离线”的定义似乎有点混乱。 “离线”对我来说意味着“不运行”。如果您想要连接超时,那么对我来说这意味着端口需要打开,连接被接受但在等待太久后被客户端丢弃。这与“离线”不同。如果它处于脱机状态,它首先不会在端口上建立连接。为了实现这一点,您只需删除资源。为什么这会导致任何合理的 Web 服务器实现超时?它可以立即看到资源的不足,因此它会立即返回该错误...。
  • 为了让客户端超时,您需要实际提供端点但从不返回任何东西,不是吗?
  • @Michael 确实,这就是我在最后一段文字中想要表达的意思。
  • @daniu 你说得对。在创建上述代码后我明白了这一点,因此我来这里寻求帮助。

标签: java spring rest spring-boot spring-mvc


【解决方案1】:

我真的不明白这种场景的用例是什么。

我可以想到一些方法:

  1. 只需停止应用程序即可。正如在 cmets 中所述 - 客户端将尝试连接并最终会遇到连接超时。

  2. “以编程方式”重新启动应用程序上下文,而无需重新启动整个 JVM。有一个tutorial 关于这样做。

第二种方法只能与应在应用程序上下文重新启动期间提供的属性 spring.main.web-environment=false 结合使用。

【讨论】:

  • 我们使用 Docker 容器来表示第三方提供的用于自动化测试的服务。我们的测试用例之一是应用程序处于脱机状态。您的第二个选项看起来很有趣.. 只有我们与 Docker 容器交互而不是休息以禁用它。所以重新打开 api 是不可能的。
  • 是的,在剩下的事情中回头是不可能的。触发器不一定是一个rest API(一个文件,数据库中的一条记录,通过消息系统发送的消息,等等)......另一方面,如果你已经有了docker,你为什么不停止容器然后把它带回来?顺便说一句,你也有 Kubernetes 吗?因为如果你这样做了,那么你可以只与 kubernetes api 交互并将副本数设置为 0,然后在你想要应用程序返回时设置为 1...
  • 我喜欢你的想法。上下移动容器实际上可能是最简单的。我对其他意见/可能性感到好奇。感谢您的帮助,我知道该怎么做:-)
猜你喜欢
  • 2019-09-28
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2017-07-12
  • 2018-04-08
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多