【问题标题】:Running Java on a Web Server在 Web 服务器上运行 Java
【发布时间】:2010-10-12 02:30:28
【问题描述】:

我已经编写了一个独立的 Java 应用程序,我已经将它打包到一个 jar 文件中,该文件接受一些命令行参数,进行一些核心计算,然后将结果连同一些输出写入默认输出流指向带有结果的文件所在的位置。

我现在想围绕这项技术创建一个网站。这个想法是用户可以填写一个 html 表单,将其发布到网页上,然后网页会调用 Java 应用程序,解析来自 Java 应用程序的结果,并将其显示给用户。

目前,我正在使用一点 PHP 从 post 请求中收集数据,然后只使用 exec 调用:

java -jar -Xmx128m myapplication.jar 命令行参数

这很糟糕吗?

我确实每天有数千次访问我的网站,Java 应用程序的每次执行可能需要 30 秒到一分钟以上的时间,所以我不想过于低效。似乎有比必须为每个请求直接调用 Java 更好的解决方案。

我不断听到诸如 java servlet、bean、tomcat、glassfish 等之类的东西,但我不明白它们是什么以及它们对我有什么好处。这些能给我什么?更快的结果是因为每次运行应用程序时都不必创建 Java JVM?更少的内存使用?我显然希望它以尽可能少的内存占用尽可能快地运行。

那么,我可以在这里采取的最佳方法是什么?我不想对我的应用程序进行任何认真的重写,因为有很多代码(因此将其重写为 C 或 C++ 是不可能的)。


谢谢。

【问题讨论】:

    标签: java php web-applications servlets


    【解决方案1】:

    好的,servlet 是设计为在容器内运行的小型应用程序。它们为您提供了一个扩展点,可以将您的 java 代码插入到像 tomcat 这样的简单 servlet 容器,或者像 glassfish 这样的功能更齐全的应用程序服务器中。您希望这样做是因为应用程序服务器承担了处理 http 交互的繁重工作,并提供了其他功能,例如安全性、日志记录、会话管理、错误处理等(请参阅servlet specification)。

    当您将应用程序置于应用程序容器(具有所有其他额外功能的 Web 服务器)中时,您还可以更好地管理应用程序的生命周期。您将能够启动和停止应用程序,而无需关闭 Web 服务器、重新部署、启动更多实例等。另外,当您想出第二个出色的应用程序时,很容易将其放在第一个旁边.或者,您可以将多台机器集群在一起,以实现应用服务器的轻松冗余和负载平衡功能。

    这只是一个开始,还有更多功能、技术和框架可以帮助您制作基于容器的应用程序。 Servlet tutorial。

    【讨论】:

      【解决方案2】:

      [这些让我明白吗]“更快的结果,因为我不必每次运行应用程序时都创建 Java JVM?”

      是的。

      而且——奖励——您可以替换 PHP,这样您的整个网站就使用一种语言:Java。

      此外,您可以考虑修改您的用例,这样一来就不再是痛苦的 30-60 秒,而是与用户交互执行的一系列更快的步骤。

      【讨论】:

        【解决方案3】:

        在 servlet 容器中运行您的代码。

        假设您需要使用 PHP 保存您的网站,并且您的机器上已经安装了 java,只需安装一个免费的 servlet 容器(例如 Apache Tomcat 或 Jetty)。配置为在未使用的端口上运行 servlet 容器。 (8080) 是它们的默认值。

        这些 servlet 容器实际上是基于 Java 的网络服务器,就像 Apache,但专门用于提供 Java 代码。

        使用 java 网络服务器而不是为每个请求调用新的 java.exe 最明显的优势是,您的 java 虚拟机 (jvm) 将始终处于“热”状态,并且正在运行。 java.exe (jvm) 的每次新启动都会给您带来额外的浪费。

        使用 servlet 容器的第二个优点是,容器将使您的代码能够在 jvm 内的新线程中针对每个新请求运行。每天为成千上万的用户提供服务不会有任何问题。如果您要启动数百个而不是一个 java 实例,您的机器很可能会崩溃。

        将您的代码放在一个 servlet 中。即使对于新手来说也很容易。您将通过 HTTP(servlet 的 doGet 或 doPost 方法)与 servlet 对话。将 php 请求表单传递给这个 servlet,让 servlet 给您返回任何内容:页面、json 对象、xml 或纯文本。

        【讨论】:

          【解决方案4】:

          您可能不想直接从网站调用 java 应用程序。正如您所说,如果 java 进程需要 30 秒才能运行,您的 Web 服务器将会陷入困境,尤其是当您的网站受到重创时。

          您可能希望查看用于分派后端处理请求的 Web 服务(可能还有消息队列)。 PHP 页面可以调用服务器上的 web 服务,然后服务器可以将处理请求放在队列中,或者只是以异步方式启动 java 应用程序。您不希望 HTTP 请求等待 java 应用程序完成,因为在处理过程中,用户只会有一个挂起的浏览器,并且 HTTP 请求可能会超时。

          Java 应用程序完成后,它可以更新数据库表,然后用户可以从网站访问该表。

          【讨论】:

            【解决方案5】:

            最简单的方法是在您的应用程序中嵌入一个网络服务器。看看Jetty。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-25
              • 1970-01-01
              • 2010-09-11
              • 1970-01-01
              • 2014-02-23
              • 2010-12-19
              相关资源
              最近更新 更多