Новое в Java EE; предложения архитектуры для сервиса / демона? - PullRequest
5 голосов
/ 08 июня 2010

Я новичок в мире Java EE.В качестве упражнения, чтобы попытаться познакомиться с Java EE, я пытаюсь создать многоуровневое веб-приложение, но я немного застрял в том, как лучше всего раскрутить сервис в фоновом режиме, который работает.

Параметры службы:

  • Он должен открывать и удерживать сокетное соединение и получать информацию от подключенного сервера.
  • Существует 1-к-1корреляция между пользователем и новым сокетным соединением.

Таким образом, идея состоит в том, что пользователь нажимает кнопку на веб-странице, и где-то на сервере открывается сокетное соединение.В течение оставшейся части пользовательского сеанса (или до тех пор, пока пользователь не нажмет какую-то кнопку разъединения) сокет остается открытым и передает полученную информацию в какое-то централизованное хранилище, которое сервлеты могут запрашивать и возвращать пользователю через AJAX.

* 1012Есть ли способ Java EE для решения этой ситуации?Естественно, я бы хотел написать Java-приложение, которое прослушивает порт, к которому сервлеты могут подключаться, и порождает новые потоки, открывающие эти сокеты, но это мне кажется очень случайным.

(PS: я также новичок в Stack Overflow, так что простите, если мне понадобится некоторое время, чтобы разобраться с сайтом!)

1 Ответ

4 голосов
/ 08 июня 2010

В стеке Java EE есть три основных контейнера: веб-контейнер, контейнер EJB и контейнер JCA. JCA предназначен для обеспечения входящего и исходящего соединения со сторонними системами, такими как база данных, JMS-брокер или другие.

«Правильный» способ создать соединение с сервером Telnet из EJB или веб-приложения - использовать для этого соединитель JCA.

[client] <-|-> [web] <--> [ejb] <--> [jca] <-|-> [telnet server]

Труба | обозначает удаленные границы. Предположим, EJB - это местные, но они все равно не обязательны; Вы также можете использовать коннектор JCA из веб-слоя.

Я предлагаю вам выяснить, существуют ли уже существующие реализации. Быстрый Google дал мне этот результат: JCA-коннектор для клиента Telnet .

Другой подход (но не совместимый со спецификацией) заключается в запуске потока, который прослушивает сокет, из ServletContextListener. Поток будет работать на веб-уровне, и вы сможете управлять подключением к серверу Telnet по своему усмотрению.

Я предлагаю вам также взглянуть на этот другой вопрос: Приложение Java EE, которое слушает сокет .

В обоих случаях вам, вероятно, потребуется выяснить, как временно хранить информацию, полученную сервером Telnet (централизованное хранилище, о котором вы упомянули), которая впоследствии будет отображаться в веб-интерфейсе. Это снова проблематично с Java EE, потому что спецификация запрещает использование глобального состояния. Например, вы не должны использовать поле static в теории. Но на практике это работает, если у вас запущен только один экземпляр приложения.

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

...