4

我有一个独立的、无头的 Java 服务器应用程序,它针对我正在考虑迁移到 Java 应用程序服务器的数据库执行一堆基于队列的处理。我有很多后端 java 经验和一点 JSP,但没有很多 servlet 经验。

似乎该方法是将我的应用程序包装到一个 servlet 中并在启动时部署它(并确保它只部署一个实例)。

几个问题:

1) 由于我的应用程序没有任何 HTTP(或其他)请求/响应机制,实现一个没有 URL 映射的 servlet 会很愚蠢吗?查看 API,我是否只需实现一个 GenericServlet 并将 service() 方法留空?

2)我的Java应用程序的另一部分打开/管理它自己的网络套接字(非HTTP)以接受传入数据流。我认为要让它适应 servlet 请求/响应模型需要做很多工作。servlet 打开/管理自己的网络套接字可以吗?

3)我们还有一堆网络应用程序(目前处于coldfusion)与java应用程序的集成不是很好(因为它们只能通过数据库进行通信)。我们正在研究 railo(另一个 servlet),我试图弄清楚 Coldfusion/railo 应用程序(在同一个应用程序服务器中运行)直接相互通信是多么容易。也许是一个显示 Java 引擎当前运行时统计/指标的网页,并最终调用 Java 引擎中的一些业务逻辑。

谢谢,布赖恩

4

2 回答 2

2
  1. Servlet 是一种通用机制,与 HTTP 世界无关(尽管 99.999% 的情况下使用了 HttpServlet)。您可以子类化 Servlet 类来实现,例如,可以响应邮件事件的 MailServlet - 但据我所知,当前的网络服务器仅支持 HTTP 映射。

  2. 套接字属于 Java EE 世界,在这种环境中启动自定义线程被认为是一件坏事——如果您打开套接字(用于轮询数据等),您肯定需要这样做。

于 2010-03-22T18:34:55.220 回答
2

如果您不想拦截 HTTP 请求,那么就不要扩展HttpServlet. 这是没有意义的。如果您真的想在 webapp 启动时将其作为“后台任务”执行并在 webapp 关闭时停止它,那么只需ServletContextListener相应地实现即可。

public class Config implements ServletContextListener {

    private YourApp yourApp;

    public void contextInitialized(ServletContextEvent event) {
        yourApp = new YourApp();
        yourApp.start();
    }

    public void contextDestroyed(ServletContextEvent event) {
        yourApp.stop();
    }

}

您可以web.xml按如下方式注册:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

如果YourApp实际上没有在单独的线程中触发任务,那么您需要将其包装在 a 中Runnable并使用ExecutorService. 例如

public class Config implements ServletContextListener {

    private ExecutorService executor;

    public void contextInitialized(ServletContextEvent event) {
        executor = Executors.newSingleThreadExecutor();
        executor.submit(new YourApp()); // YourApp should implement Runnable.
    }

    public void contextDestroyed(ServletContextEvent event) {
        executor.shutdown();
    }

}

毕竟,如果您的 web 应用程序除此之外什么都不做,那么我质疑在 servlet 容器中运行它的价值。而是使用该main()方法将其作为独立的 Java 应用程序运行。

于 2010-03-22T18:41:33.070 回答