Как обслуживать сокет из приложения Java EE? - PullRequest
9 голосов
/ 14 января 2010

Мы хотели бы обслуживать некоторые клиентские запросы на нашем сервере приложений Java EE (JBoss 4.2.3). Я читал, что спецификация Java EE не позволяет открывать сокет из корпоративного компонента . Но спецификация не предлагает альтернативы.

В частности, корпоративные компоненты не должны:

  • прослушивать, принимать подключения или многоадресную рассылку от сетевого сокета

Итак, вопрос: что я могу сделать, чтобы обслуживать некоторые двоичные протоколы tcp (не http) с сервера приложений?

Здесь кто-то предлагает реализовать адаптер ресурсов . Это ваш путь или есть другие (более простые) решения?

Ответы [ 5 ]

7 голосов
/ 14 января 2010

Вы правы, поскольку вы можете объявлять транзакции для каждой вещи в Java EE, они должны поддерживаться всеми компонентами, которые вы хотите подключить. Файлы, если таковые имеются, должны храниться в базе данных. Контейнер должен контролировать все, потому что это единственный способ иметь масштабирующее приложение, использующее Java EE.

Несколько вариантов:

  • Реализация коннектора (JCA), пример здесь: http://www.theserverside.com/tt/articles/article.tss?l=J2EE1_4 вероятно, лучший способ, если у вас есть существующие клиенты.

  • Использовать очереди сообщений Java

  • Связь между этими методами обсуждается здесь http://java.sun.com/products/jms/faq.html#relship_ejbs

  • Сервер записи, который хранит запросы в базе данных. (Без поддержки Tx)

  • Если у вас есть только один сервер, и это требует слишком много времени, вы можете игнорировать эти аспекты и следовать предложению Vinegars. Но если вам нужно Tx позже или дополнительные узлы эта часть должна быть переработана.

2 голосов
/ 14 января 2010

Также вы не должны обращаться к файлам: (

Это в спецификации, потому что EJB должны быть:

  • распространяемый (вы не знаете заранее, на каком сервере / экземпляре будет развернут ваш EJB
  • контейнер должен иметь возможность управлять "всем", поэтому вы не должны создавать свои собственные потоки

То, что ничто не остановит вас от запуска сокета сервера в вашем приложении (лучшее место, вероятно, будет в сервлете), но вы должны позаботиться о том, как сокет сервера закрывается, когда ваше приложение выходит из строя ...

1 голос
/ 14 января 2010

Прямо сейчас я реализую обходной путь:

альтернативный текст http://yuml.me/7f82bd5c

Я использую автономное Java-приложение, которое принимает tcp-вызовы от клиента и перенаправляет их как вызовы JNDI на сервер приложений.

0 голосов
/ 23 октября 2015

Хотя это не строго TCP-соединение, но вы можете достичь того, что вам нужно, с помощью аннотации @ServerEndpoint для создания WebSocket из спецификации Java EE7.

Хотя при этом используется HTTP, он будет функционировать немного как двоичный интерфейс, когда ваш @OnMessage метод и ByteBuffer (или byte[]) в качестве аргумента.

0 голосов
/ 19 ноября 2013

Я использовал несколько похожее решение в соответствии со своими потребностями в Spring MVC. Может быть, это может помочь кому-то здесь.

Запустить Socket Port при запуске сервера. Я использовал аннотацию @scheduler, тогда как вы можете использовать решение на основе слушателя. Вы также можете реализовать слушатель ApplicationContextAware и получить доступ к другим компонентам приложения из него. </p> <pre><code>@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) public void startListenerPort() { ServerSocket socket = new ServerSocket(9999); // do some stuff here }

Просто убедитесь, что вы разрешили TCP-трафик через порт, назначенный для сокета (настройки брандмауэра).

Таким образом, вы можете иметь TCP-трафик на порту 9999, где ваш сервер приложений будет продолжать работать на другом порту, как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...