Что происходит, когда несколько приложений Java-сервлетов работают на одном и том же порту? - PullRequest
2 голосов
/ 01 апреля 2010

Что-то странное случилось с моими сервлетами, и я думаю, что понял, почему, но я еще больше запутался. Я использовал Netbean6.7 для разработки сервлета сообщений Paypal IPN (Instant Payment Notification), он прослушивает порт 8080 по умолчанию для сообщений Paypal IPN. Я использовал пример кода Java с его веб-сайта, но когда он запускался, получалось только примерно 1 из 10 сообщений, и они выглядели правильно, но почему 1 из 10? Не 100% или нет?

Итак, я задал здесь несколько вопросов и получил несколько советов, один из которых, в частности, указывает мне на Google App Engine, поэтому я скачал его и запустил демонстрационную гостевую книгу, пока мой сервлет IPN все еще работает на NetBeans, странная вещь произошла после того, как я введя "appengine-java-sdk-1.3.2 \ bin \ dev_appserver.cmd appengine-java-sdk-1.3.2 \ demos \ guestbook \ war" из командной строки, я перешел на следующий URL в своем браузере "http://localhost:8080/", Я думал, что увижу страницу гостевой книги Google demo, НЕТ, то, что я увидел, это еще один сервлет, который я разработал 2 года назад: "Веб-Академия", приложение для регистрации онлайн-курсов.

Как это может произойти? Я никогда не начинал это, и я не касался этого проекта в течение многих лет. Я думаю, потому что он также прослушивает порт 8080, так что теперь я понимаю, почему сообщения IPN поступали только 1 из 10 раз, потому что другой сервлет также прослушивал этот порт и мог получить сообщения, предназначенные для IPN, или как-то эти два процессы сервлетов перепутались и поэтому не могли должным образом реагировать на Paypal, и потерпели неудачу. Для проверки некоторых моих догадок.

Я отключаю NetBeans и снова запускаю гостевую книгу Google при появлении приглашения, на этот раз в моем браузере http://localhost:8080/ указывает на страницу демонстрационной гостевой книги.

Мои URL выглядят так:

Итак, мои вопросы:

  1. Почему сервлет «Веб-академия» запускался автоматически, когда я запускал сервлет Paypal?
  2. Если я изменю порт прослушивания IPN на 8083, будет ли это означать, что я смогу одновременно запустить их на своем ПК, не влияя друг на друга?
  3. Но я все еще не понимаю, [A] и [B] выглядят по-разному, если страница для [A] обновляется, она должна отображать содержимое Paypal, а другая страница, смотрящая на [B], должна отображать Интернет Содержание Академии, и это именно то, что происходит, когда я запустил Netbeans для запуска сервлета Paypal, обе страницы корректно отображают свой соответствующий контент, не мешая друг другу, почему сообщения IPN не могли проходить 100% времени?
  4. В Netbeans как назначить 8080 сервлету [A] и назначить порт 8083 сервлету [B]?
  5. Как отключить автоматический запуск Web Academy по Netbeans?

Ответы [ 5 ]

4 голосов
/ 01 апреля 2010

Первый: сервлет! = Веб-сервер. Сервлет - это интерфейс программирования приложений Java, который должен работать в контейнере сервлетов. Контейнер сервлета обычно является частью веб-сервера Java, такого как Apache Tomcat и Glassfish. Веб-сервер обычно прослушивает определенный порт для HTTP-запросов. Контейнер сервлетов создает и создает экземпляры сервлетов при запуске. Каждый запрос, URL-адрес которого совпадает с url-pattern сервлета, позволяет сервлет-контейнеру выполнять сервлет.

Второе: Netbeans! = Веб-сервер. Netbeans - это интегрированная среда разработки (IDE). Это просто инструмент разработки с кучей мастеров, который должен облегчить разработку. Вы можете прекрасно работать с cmd.exe и notepad.exe и автономным сервером, как с IDE. Вам просто нужно знать , что вы делаете.

Что касается вашей реальной проблемы: вы, вероятно, разработали проект «Веб-академия» в Netbeans ранее и развернули его как проект «ROOT» соответствующего веб-сервера. Возможно, GAE не удалось запуститься, поскольку порт используется веб-сервером, управляемым Netbeans (вы заметили какие-либо сообщения об ошибках во время запуска GAE?). Выключение NetBeans (что немного радикально, достаточно было просто закрыть веб-сервер, управляемый NetBeans), что освободило бы порт.

При этом, честно говоря, вся эта путаница, похоже, сводится к тому, что вы никогда не изучали основные концепции Java / Servlet по отдельности и сразу же погрузились в глубокую яму с помощью универсальной IDE, где вам нужно выучить 1000 разных вещей в целом в одном месте и предположил, что это «единственно правильное» место, чтобы сделать это. Я настоятельно рекомендую сделать паузу и возобновить изучение основных понятий один за другим. Получите хорошие книги и найдите время, чтобы все было в порядке. Изучайте Java SE отдельно. Выучите сервлеты отдельно. Изучайте Netbeans отдельно. Изучите веб-сервер отдельно. И так далее. Тогда делай математику. Удачи.

3 голосов
/ 01 апреля 2010

В вашем вопросе столько вопросов, что я не знаю, с чего начать. Что точно, так это то, что вам нужно вернуться к основам и потратить некоторое время, чтобы понять, как все работает. Сервлеты - это фрагменты кода, упакованные внутри веб-приложения , которое развернуто в контейнере сервлетов (сервер). Давайте посмотрим, как вы получаете к ним доступ:

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

Где:

  • A - это машина (имя хоста или IP), на которой работает контейнер сервлета.
  • B - это порт, к которому контейнер сервлета прислушивается (не сервлет).
  • C - это путь к веб-приложению (обычно это имя веб-архива без расширения .war, но веб-приложение может быть сопоставлено с "/" или корневым контекстом).
  • D - шаблон URL, на который отображается сервлет.

Теперь давайте попробуем ответить на ваши вопросы:

Почему сервлет "Веб-академия" запускался автоматически, когда я запускал сервлет Paypal?

Я предполагаю, что это старое приложение все еще развернуто на сервере, который вы используете под NetBeans (возможно, встроенным сервером NetBeans). Поэтому, когда вы «запускаете» новое приложение (и фактически сервер), старое также становится доступным.

Если я изменю порт прослушивания IPN на 8083, будет ли это означать, что я смогу одновременно запускать их на своем ПК, не влияя друг на друга?

Как мы видели, это не имеет смысла, сервер слушает порт, а не сервлет.

Но я все еще не понимаю, [A] и [B] выглядят по-разному, если страница для [A] обновляется, она должна отображать содержимое Paypal, а другая страница, смотрящая на [B], должна отображать Интернет Содержание Академии, и это именно то, что происходит, когда я запустил Netbeans для запуска сервлета Paypal, обе страницы корректно отображают свой соответствующий контент, не мешая друг другу, почему сообщения IPN не могли проходить 100% времени?

URL [A] указывает на PayPal_Servlet PayPal_App. URL [B] указывает на страницу по умолчанию веб-приложения, сопоставленную с корневым контекстом. Другими словами, оба URL-адреса указывают на разные приложения.

В Netbeans, как назначить 8080 сервлету [A] и назначить порт 8083 сервлету [B]?

Извините, что повторяю это, но это не имеет смысла. Скорее всего, вы можете изменить порт, используемый сервером, запущенным в NetBeans, но, тем не менее, оба сервлета будут обслуживаться одним сервером, работающим на новом порту.

Как отключить автоматический запуск Web Academy по Netbeans?

Я не уверен, но сделайте некоторую очистку в каталоге, где развернуты приложения (с помощью tomcat, проверьте каталог webapps) или в server.xml. Трудно сказать, без подробностей о вашей конфигурации, о том, что вы установили и т. Д.

1 голос
/ 01 апреля 2010

Вы не можете назначить порт сервлету. Вы назначаете порт сервлет-контейнеру (Tomcat, Jetty, Glassfish, JBoss и т. Д.). Сервлет - это просто экземпляр javax.servlet.Servlet, а не целый сервер.

Если вы хотите, чтобы на сервере работало более одного сервлета, вы создаете сервлет (я думаю, вы захотите расширить javax.servlet.http.HttpServlet) и сконфигурируете его в web.xml для своего приложения. Пока имена ваших севлетов не конфликтуют, с вами все будет в порядке.

1 голос
/ 01 апреля 2010

Я предполагаю, что либо у вас есть контейнер сервлетов, работающий извне, и вы просто настроили NB для его использования, либо вы импортировали все свои старые проекты NB, и все они каким-то образом развернуты. Причина, по которой вы увидели свое приложение для регистрации, заключалась в том, что вы не просматривали файлы журналов GAE, поэтому вы не заметили, что оно умерло, когда оно не могло прослушивать порт. Вы также не присвоили приложению уникальный URL-адрес, поэтому запросы, отправленные в корень, обрабатывались приложением регистрации. Ничто из этого не объясняет, почему ваши запросы PayPal сбрасываются, я бы запустил snoop / wireshark / что угодно и проверил ваш HTTP-трафик. Я думаю, в вашем приложении есть ошибка. Проверка файла журнала контейнера сервлета может выявить некоторые подсказки. Чтобы отменить развертывание приложения регистрации, выясните, где на сервере приложений хранятся веб-приложения, и удалите либо файл war, либо каталог, содержащий файлы приложения регистрации.

1 голос
/ 01 апреля 2010

Сервлеты сопоставляются с уникальными URL-адресами, которые включают в себя порт, поэтому вполне допустимо, чтобы несколько сервлетов прослушивали один и тот же номер порта. Это обычно, когда у вас есть один веб-контекст с более чем одним сервлетом / JSP, связанным с одним URL.

URL для вашего контекста обычно выглядит так:

http://host:port/context-name

В вашем случае хост - это localhost, порт - 8080. Но имя-контекста - «PayPal_App» для одного и корень для другого. Я думаю, что было бы разумно использовать другой контекст, такой как «демо», для другого приложения, а не корневой контекст. Ваши приложения там не принадлежат.

...