2010-06-08 4 views
5

Soy nuevo en el mundo de Java EE. Como un ejercicio para tratar de familiarizarme con Java EE, estoy tratando de crear una aplicación web por niveles, pero me estoy quedando un poco atrapado en lo que es la mejor manera de activar un servicio en segundo plano que funciona.Nuevo en Java EE; sugerencias de arquitectura para un servicio/daemon?

parámetros del servicio:

  • Se debe abrir y mantener una conexión de socket y recibir información desde el servidor conectado.
  • Existe una correlación 1-a-1 entre un usuario y una nueva conexión de socket.

Así que la idea es que el usuario presiona un botón en la página web, y en algún lugar del servidor se abre una conexión de socket. Para el resto de la sesión de los usuarios (o hasta que el usuario presiona algún tipo de botón de desconexión) el socket permanece abierto y envía la información recibida a algún tipo de tienda centralizada que los servlets pueden consultar y devolver al usuario a través de AJAX.

¿Hay una forma de Java EE para manejar esta situación? Naturalmente, lo que me gustaría hacer es escribir una aplicación Java que escuche en un puerto al que los servlets puedan conectarse y engendre nuevos hilos que abran estos sockets, pero eso me parece muy ad-hoc.

(PS: Yo también soy nuevo en desbordamiento de pila, así que perdónenme si me lleva algún tiempo para averiguar el sitio fuera!)

+0

¿Puede ampliar el propósito de abrir un socket y presionar datos? Desde su aplicación web, ¿desea abrir una conexión a otra aplicación y enviar datos que la primera aplicación web puede consultar?¿De dónde provienen estos datos y cómo se ven? –

+0

Para los propósitos de esta pregunta, digamos que la página web es un front-end para una conexión telnet. En el servidor, la conexión de telnet debe mantenerse abierta hasta que el usuario diga "cerrar" o se agote el tiempo de espera. Esa conexión necesita escribir en el texto del socket que el usuario escribe y leer desde el texto del socket que escribe el servidor telnet. ¡Espero que eso ayude a aclarar! – Kate

Respuesta

4

Hay tres contenedores principales de la pila de Java EE: el contenedor Web, el contenedor EJB y el contenedor JCA. JCA está destinado a proporcionar conectividad entrante y saliente con sistemas de terceros, como bases de datos, intermediarios JMS u otros.

La forma "correcta" de crear una conexión a un servidor Telnet desde un EJB o aplicación web sería usar un conector JCA para eso.

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

La tubería | denota límites remotos. Un supuesto EJB son locales, pero son opcionales de todos modos; también puede usar el conector JCA desde la capa web.

Sugiero que investigue si hay una implementación existente. Un google rápido me dio este resultado: JCA connector for Telnet client.

Otro enfoque (pero no cumple con la especificación), es iniciar el hilo que escucha el socket desde un ServletContextListener. El hilo se ejecutará en la capa web y podrá administrar la conectividad con el servidor Telnet como desee.

Le sugiero que también eche un vistazo a esta otra pregunta: Java EE application that listens to a socket.

En ambos casos, probablemente necesite averiguar cómo almacenar temporalmente la información recibida por el servidor Telnet (la tienda centralizada que usted menciona) que luego se mostrará en la interfaz web. Esto es nuevamente problemático con Java EE, porque las especificaciones prohíben el uso del estado global. Por ejemplo, no debería usar el campo static en teoría. Pero en la práctica eso funciona si solo tiene una instancia de su aplicación ejecutándose.

Eso es solo un bosquejo, pero espero que ayude.

+0

¡Esto parece prometedor! ¿Diría que este sigue siendo un buen artículo para aprender (escrito en diciembre de 2001): http://java.sun.com/developer/technicalArticles/J2EE/connectorclient/resourceadapter.html – Kate

+1

@Kate El enlace que menciona está bien , pero en mi humilde opinión, el mejor documento sobre JCA para comenzar es "Creación de adaptador de recursos con J2EE Connector Architecture 1.5". El código correspondiente se puede encontrar en las muestras J2EE que vienen con el SDK. http://developers.sun.com/appserver/reference/techart/resource_adapters.pdf De lo contrario, google para Frank Kievet, creo que tenía excelentes artículos. Otros de mis recursos incluyen dos publicaciones de blog que escribí sobre él http://www.ewernli.com/web/guest/52 http://www.ewernli.com/web/guest/51 y algunas otras respuestas de SO: http : //stackoverflow.com/search? q = usuario% 3A217862 + jca. – ewernli

+0

No sé cómo funciona el sistema de clasificación de Stack Overflow, pero definitivamente revisaré estos dos artículos y probaré una solución. Si no encuentro ningún problema difícil de resolver, ¡marcaré su respuesta como una solución! ¡Muchas gracias! – Kate