问题 在Web服务器上运行Java


我编写了一个独立的Java应用程序,我将其打包到一个jar文件中,该文件接受一些命令行参数,执行一些硬核计算,然后将结果写入文件以及一些输出到指向where的默认输出流结果的文件是。

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

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

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

这不好吗?

我每天都有几千次访问我的网站,每次执行Java应用程序的时间可能超过30秒到一分钟,所以我不想过于低效。似乎有一种更好的解决方案,而不是直接为每个请求调用Java。

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

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


谢谢。


6754
2018-03-09 01:45


起源



答案:


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

当您在应用程序内容(具有所有其他额外功能的Web服务器)中使您的应用程序生效时,您还可以更好地管理应用程序的生命周期。您可以在不关闭Web服务器,重新部署,启动更多实例等的情况下启动和停止应用程序。此外,当您提出第二个应用程序时,它很容易将其放在第一个应用程序旁边。或者,您可以将多台计算机集群在一起,以实现应用程序服务器的简单冗余和负载平衡功能。

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


12
2018-03-09 02:06





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

是。

并且 - 奖励 - 您可以替换PHP,以便整个站点使用单一语言:Java。

此外,您可以考虑修改您的用例,这样一次拍摄就不会是痛苦的30-60秒,但也许是与用户交互执行的一系列更快的步骤。


2
2018-03-09 01:52





在servlet容器中运行代码。

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

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

使用java webserver而不是每个请求的新java.exe调用最明显的优点是,你的java虚拟机(jvm)将始终“热”,启动并运行。 java.exe(jvm)的每个新开始都会给你带来额外的浪费。

使用servlet容器的第二个好处是,容器将使您的代码能够在jvm内的新线程中为每个新请求运行。您每天为数千名用户提供服务毫无问题。最有可能的是,如果你要启动数百个java实例而不是一个java实例,那么你的机器将会崩溃。

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


2
2018-03-09 02:11





您可能不希望直接从网站调用Java应用程序。就像你说的那样,如果java进程需要30秒才能运行,那么你的网络服务器就会陷入困境,特别是如果你的网站被捣乱了。

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

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


0
2018-03-09 01:49





最简单的方法是在您的应用程序中嵌入一个Web服务器。看一下 码头


0
2018-03-09 10:07