【问题标题】:Fire off an internal ServletRequest in Tomcat在 Tomcat 中触发内部 ServletRequest
【发布时间】:2009-11-13 08:29:16
【问题描述】:

我正在使用 Quartz 为 Web 应用程序安排后台任务。其中一些任务只是触发针对同一个 Web 应用程序的请求。

我想避免依赖于任何类型的网络设置(例如,如果从数据中心内发出的使用我自己的域名的请求可能无法正确路由)。是否有 Java API 可以触发 ServletRequest 并由 Tomcat 在内部处理(不涉及任何实际的 HTTP)?

我仍然想将工作包装到一个 Servlet 请求中,而不是直接调用后台任务的 Java 代码,这样我就可以回到常规的 HTTP 请求作为配置选项。

Tomcat 特定的代码是可以接受的。

【问题讨论】:

    标签: java tomcat servlets request


    【解决方案1】:

    您想从这些计划任务中获得什么?标准的 Web 服务器行为是获取 HTTP 请求并使用特定数据进行响应。我假设您的任务不需要它,即您只想执行代码库驻留在 Web 应用程序中的特定处理。

    如果上述假设是正确的,您可以将 servlet/jsp 逻辑与业务处理逻辑分离,并直接从您的计划任务中调用业务逻辑层类。

    【讨论】:

      【解决方案2】:

      有趣的概念。对此当然没有标准的 API,而且我认为也没有公开的 Tomcat 特定机制。

      什么会收到请求?一个小服务程序? JSP?弹簧控制器?取决于此,并且取决于目标的功能,您可能能够直接调用目标,而不是通过容器路由它。但是如果您有 JSP、一堆过滤器和其他复杂的 servlet,这可能是不是一个选项。

      如果您有机会使用 Spring,那么您的 Quartz 工作可以直接与控制器连接起来,这很容易。你有那么幸运吗?

      【讨论】:

      • 我想通过一个 URL(而不是直接调用控制器),以便以后可以返回到常规 HTTP。保持事物解耦。
      • 标准 API:如果我自己在一个 servlet 中,我想我可以做 requestDispatcher.include(fakedRequest, fakedResponse)。但我不是。
      【解决方案3】:

      使用 URLConnection 或 apache-commons httpclient 和 localhost / 127.0.0.1 - 这样它就会被正确路由。

      【讨论】:

      • 假设服务器正在侦听 127.0.0.1,但情况并非总是如此。
      【解决方案4】:

      servlet 代码的职责太多。将它重构为一个普通的 Java 类并让任务类访问它(或者反过来,让它访问任务类)。如有必要,请明智地使用ServletContext

      如果您详细说明您认为这是解决方案的实际问题和功能要求,我们可能会提出更好的建议。

      【讨论】:

      • “实际问题和功能需求”:我真的不需要这样做,我只是想知道我是否可以。
      • 您可以使用java.net.URLConnection 或多次提到的Apache Commons HttpClient 来执行此操作。然而,完整的图片有点味道,我只是想在为时已晚之前警告这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多