【问题标题】:What happens when several Java servlet apps running on the same port?当多个 Java servlet 应用程序在同一个端口上运行时会发生什么?
【发布时间】:2010-04-01 16:02:06
【问题描述】:

我的 servlet 发生了一些奇怪的事情,我想我已经找到了原因,但我更加困惑。我使用Netbean6.7开发了一个Paypal IPN(即时支付通知)消息servlet,它默认在8080端口监听Paypal IPN消息。我使用了它网站上的一些示例 Java 代码,但是当它运行时,只有大约十分之一的消息通过了,而且它们看起来是正确的,但为什么只有十分之一呢?不是 100% 还是没有?

所以我在这里问了一些问题并得到了一些建议,其中一个特别指出我使用 Google 的 App Engine,所以我下载了它并运行了演示留言簿,而我的 IPN servlet 仍在 Netbeans 上运行,奇怪的事情发生了,在我从命令提示符输入“appengine-java-sdk-1.3.2\bin\dev_appserver.cmd appengine-java-sdk-1.3.2\demos\guestbook\war”,我在浏览器上转到以下网址“@987654321 @",我以为我会看到谷歌演示留言簿页面,不,我看到的是我2年前开发的另一个servlet:“Web Academy”,在线课程注册应用程序。

怎么会这样?我从来没有开始过它,而且我已经很多年没有接触过那个项目了。我猜是因为它也在侦听端口 8080,所以现在我明白为什么 IPN 消息只有十分之一的通过,因为另一个 servlet 也在该端口上侦听,并且可能已经收到了针对 IPN 的消息,或者这两个消息是如何servlet 的进程混合在一起,因此无法正确响应 Paypal,并且失败了。为了验证我的一些猜测。

我关闭了 Netbeans,并在提示符下再次运行 Google 留言簿,这次在我的浏览器上 http://localhost:8080/ 指向演示留言簿页面。

我的网址如下所示:

所以现在,我的问题是:

  1. 为什么当我运行 Paypal servlet 时“Web Academy”servlet 会自动启动?
  2. 如果我将 IPN 侦听端口更改为 8083,是否意味着我可以在我的 PC 上同时运行它们而不会相互影响?
  3. 但我还是不明白,[A] 和 [B] 看起来不一样,如果刷新 [A] 的页面,它应该显示 Paypal 内容,而另一个查看 [B] 的页面应该显示 Web学院的内容,这正是我启动 Netbeans 运行 Paypal servlet 时发生的情况,两个页面并排正确显示各自的内容而不会相互干扰,为什么 IPN 消息无法 100% 通过?
  4. 在 Netbeans 中如何将 8080 分配给 servlet [A] 并将端口 8083 分配给 servlet [B] ?
  5. 如何通过 Netbeans 关闭 Web Academy 的自动启动?

【问题讨论】:

  • 请更好地格式化您的问题;它很难读。段落就像小马,它们是你的朋友!
  • 并且,请知道您的 servlet 容器是什么。 NetBeans 不是 servlet 容器。

标签: java servlets jakarta-ee


【解决方案1】:

首先:Servlet != Web 服务器。 servlet 是一个 Java 应用程序编程接口,应该在 servlet 容器中运行。 servletcontainer 通常是 Java Web 服务器的一部分,例如 Apache Tomcat 和 Glassfish。 Web 服务器通常在某个端口上侦听 HTTP 请求。 servlet 容器在启动时创建和实例化 servlet。每个 URL 与 servlet 的 url-pattern 匹配的请求都会让 servletcontainer 执行 servlet。

第二个:Netbeans != 网络服务器。 Netbeans 是一个集成开发环境 (IDE)。它只是一个带有一堆向导的开发工具,应该可以简化开发。您可以使用 cmd.exe 和 notepad.exe 以及独立服务器进行开发,就像使用 IDE 一样完美。你只需要知道你在做什么。

至于您的实际问题:您之前可能已经在 Netbeans 中开发了“Web Academy”项目并将其部署为相关网络服务器的“ROOT”项目。 GAE 可能无法启动,因为该端口正被 Netbeans 管理的网络服务器使用(您在 GAE 启动期间是否注意到任何错误消息?)。关闭 Netbeans(这有点剧烈,只需关闭 Netbeans 管理的网络服务器就足够了)会释放端口。

也就是说,老实说,所有这些困惑似乎都归结为您从未单独学习过基本的 Java / Servlet 概念,并立即使用一体式 IDE 深陷其中,您必须总共学习 1000 种不同的东西在一个地方,并假设这是“唯一正确”的地方。我强烈建议暂停并重新开始一个一个地学习基本概念。买一些好书,花时间把它做好。单独学习 Java SE。单独学习 Servlet。单独学习 Netbeans。单独学习网络服务器。等等。然后做数学。祝你好运。

【讨论】:

  • 我想自嘲一下,是的,你说得很好,我采取了最短的路线来启动并运行一个项目,但忽略了一些基本步骤,谢谢,更多的学习和需要更多是时候学习它们了。
【解决方案2】:

您的问题中有很多问题,我不知道从哪里开始。可以肯定的是,您需要回到基础知识并花一些时间来了解事物的工作原理。 Servlet 是封装在 web 应用程序 中的代码片段,该应用程序部署在 servlet 容器(服务器)中。让我们看看您如何访问它们:

http://<host>:<port>/<context>/<url-pattern>
         A      B        C           D

地点:

  • A 是运行 servlet 容器的机器(主机名或 IP)。
  • B 是 servlet 容器 正在侦听的端口(不是 servlet)。
  • C 是 Web 应用程序的路径(通常是不带 .war 扩展名的 Web 存档名称,但 Web 应用程序可以映射到“/”,也就是根上下文)。
  • D 是 servlet 映射到的 URL 模式。

现在,让我们试着回答你的问题:

为什么当我运行 Paypal servlet 时“Web Academy”servlet 会自动启动?

我的猜测是,这个旧应用程序仍然部署在您在 NetBeans 下使用的服务器上(可能是 NetBeans 内置服务器)。因此,当您“启动”新应用程序(实际上是服务器)时,旧应用程序也可以访问。

如果我将 IPN 监听端口更改为 8083,这是否意味着我可以在我的 PC 上同时运行它们而不会相互影响?

正如我们所见,这没有意义,服务器正在侦听端口,而不是 servlet。

但我还是不明白,[A] 和 [B] 看起来不一样,如果刷新 [A] 的页面,它应该显示 Paypal 内容,而另一个查看 [B] 的页面应该显示 Web学院的内容,这正是我启动 Netbeans 运行 Paypal servlet 时发生的情况,两个页面并排正确显示各自的内容而不会相互干扰,为什么 IPN 消息无法 100% 通过?

URL [A] 指向 PayPal_App 的 PayPal_Servlet。 URL [B] 指向映射到根上下文的 Web 应用程序的默认页面。换句话说,两个 URL 都指向不同的应用程序。

在 Netbeans 中如何将 8080 分配给 servlet [A] 并将端口 8083 分配给 servlet [B] ?

很抱歉重复一遍,但这没有意义。您很可能会更改在 NetBeans 中启动的服务器使用的端口,但是,两个 servlet 仍将由同一台服务器提供服务,并在新端口上运行。

如何通过 Netbeans 关闭 Web Academy 的自动启动?

我不确定,但在部署应用程序的目录(使用 tomcat,检查webapps 目录)或server.xml 中进行一些清理。如果没有关于您的配置、安装的内容等的更多详细信息,很难说。

【讨论】:

  • 感谢您提供详细信息,这是否意味着我的 Paypal IPN servlet 的问题不是由“Web Academy”servlet 的自动启动引起的,那么可能是什么原因?可能是服务器太忙而无法响应 IPN 消息?但是我并没有经常刷新网页,我的电脑大部分时间都是闲置的?收到的 10 条消息中有 1 条的解释是什么?
  • @Frank 实际上,我认为 PayPal IPN servlet 问题与其他应用程序正在运行这一事实无关。也就是说,我对 IPN 了解不多,但是……你怎么知道只有十分之一的消息通过了?你检查过服务器日志吗?其他消息可能出现问题。你可以发送测试消息吗?如果是,请放置一个断点并调试您的代码:)
  • Paypal 有一个测试页面,我可以给它我的 servlet url 并单击一个按钮来发送不同的测试消息,当我的 servlet 运行时,在我单击“发送 IPN”按钮后,大约 1 in我的 servlet 可以接收 10 条消息并保存到一个文件夹中。对于失败的,它在它的页面上说:“IPN传递失败。无法连接到指定的URL。请验证URL并重试。”我该如何调试?
【解决方案3】:

Servlet 映射到包含端口的唯一 URL,因此让多个 Servlet 监听同一个端口号是完全可以的。当您有一个 Web 上下文以及多个与单个 URL 关联的 servlet/JSP 时,这种情况很常见。

上下文的 URL 通常如下所示:

http://host:port/context-name

在您的情况下,主机是 localhost,端口是 8080。但是上下文名称是“PayPal_App”,一个是“PayPal_App”,另一个是根。我认为你最好为你的其他应用程序使用另一个上下文,比如“演示”,而不是根上下文。你的应用不属于那里。

【讨论】:

    【解决方案4】:

    您不能将端口分配给 servlet。您为您的 servlet 容器(如 Tomcat、Jetty、Glassfish、JBoss 等)分配一个端口。servlet 只是 javax.servlet.Servlet 的一个实例,而不是整个服务器。

    如果您希望在服务器中运行多个 servlet,您可以创建一个 servlet(我想您会想要扩展 javax.servlet.http.HttpServlet)并在 web.xml 中为您的应用程序配置它。只要你的 sevlet 的名称不冲突,你应该没问题。

    【讨论】:

      【解决方案5】:

      我猜要么你有一个在外部运行的 servlet 容器,而你只是配置了 NB 来使用它,或者你已经导入了所有旧的 NB 项目,并且它们都以某种方式部署了。您看到注册应用程序的原因是您没有查看 GAE 日志文件,因此您没有注意到它在无法侦听端口时死亡。您也没有为应用程序分配唯一的 URL,因此到根目录的请求由注册应用程序处理。这些都不能解释为什么您的 PayPal 请求被丢弃,我会启动 snoop/wireshark/whatever 并检查您的 HTTP 流量。我的猜测是你的应用程序有一个错误。检查 servlet 容器日志文件可能会发现一些线索。要取消部署您的注册应用,请找出您的应用服务器存储 Web 应用的位置,然后删除 war 文件或保存注册应用文件的目录。

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 1970-01-01
        • 2012-02-26
        • 2019-07-25
        • 2012-06-28
        • 1970-01-01
        • 2015-11-07
        • 2013-04-04
        • 2017-03-24
        相关资源
        最近更新 更多