java - 在 servlet 容器启动后立即调用对 localhost 的请求

标签 java spring spring-mvc tomcat servlets

我希望让我的 Java Web 应用程序在 servlet 容器(无论是 tomcat、jetty 等)开始接受请求后立即在本地主机 URL 上调用自身。

我正在使用 java spring 框架,但我认为这是一个“附带问题”,因为它确实是我需要注意的 servlet 容器的状态。

据我了解,spring 首先使用其所有 bean 初始化应用程序上下文,然后映射 URL 并初始化 DispatcherServlet处理请求的处理/过滤。

我正在寻找可以安全使用 RestTemplate 的“时刻”调用服务器本身。我尝试过的一切似乎都“为时过早”,因为它导致了 java.net.ConnectException: Connection refused -- 除了当我通过 Controller 端点从 Web 浏览器手动调用它时 -- 它成功了。

我试过使用:

  1. javax.servlet.ServletContextListener根据 How to invoke a method on a servlet or controller after the web container has successfully started
  2. org.springframework.context.ApplicationListener<ContextRefreshedEvent>
  3. DispatcherServlet 之后带有“启动时加载”的 hacky 自定义 servlet 的 init 方法

在某个时间点,servlet 容器必须接管 spring 的设置并将“开关”切换到“打开”。另外,我想以 servlet 容器“不可知”的方式执行此操作,这样我就没有特定的 tomcat/jetty 代码。

这是 resttemplate 异常。我在端口 9090 上运行应用程序,我的 contextPath 是“openid-connect-provider”。 “foo”是一个非常简单的 GET 端点,正如我所提到的,在 servlet 容器启动后调用时可以正常工作。

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:9090/openid-connect-provider/foo": Connection refused; nested exception is java.net.ConnectException: Connection refused
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:582)
...

我唯一能说的是,这些错误发生在我的日志/控制台中,就在 Jetty 告诉我它开始之前:

[INFO] Started ServerConnector@1bcba9c7{HTTP/1.1,[http/1.1]}{0.0.0.0:9090}
[INFO] Started @13749ms
[INFO] Started Jetty Server

[更新] 更多的背景。我正在实现 OAuth2 授权服务器 (AS)。我的用户凭据位于一个单独的数据库中,我需要通过单独的服务(即 oauth2 资源服务器或 RS)访问该数据库。我需要我的 AS 调用 RS 来对用户进行身份验证,但我想用我的 AS 授予的 token 来保护我的 RS。所以,我需要将我的 AS 设置为它自己的 oauth2 客户端,以便它可以安全地调用 RS。为此,我想动态注册应用程序(自身)以获取生成的 client_id/client_secret 凭据,以便它可以调用我的 RS。理想情况下,我希望我的用户信息位于同一服务中,而不必这样做,但这是 6 个月的过渡步骤。

最佳答案

你能在你的 ServletContextListener#contextStarted 事件结束时尝试这个小技巧吗

new Thread(() -> {
        try {
            Thread.currentThread().sleep(500);
            // Your client call.
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();

您可以调整 hibernate 时间。

关于java - 在 servlet 容器启动后立即调用对 localhost 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660784/

相关文章:

java - Spring Boot 应用程序卡在 : Initializing Spring DispatcherServlet 'dispatcherServlet'

spring - 什么是Spring beans bean的用途是什么

java - 有没有办法使用 Perl 或 Java 将内容发布到 Drupal 站点?

java - 使包含不同对象的 ArrayList<?> 可打包

java - 在 Java 中引用另一个类变量

java - 使用 AND 运算符 CriteriaBuilder 的规范和谓词集合

spring - Spring 的 GA、RC 和 M2 版本有什么区别?

java.lang.NoClassDefFoundError : net/sf/cglib/asm/util/TraceClassVisitor

java - 使用HashSet进行重复检查并将其转换回List

ruby-on-rails-3 - Multi-Tenancy SaaS的框架