2010-01-14 12 views
9

Nos gustaría atender algunas solicitudes de clientes dentro de nuestro servidor de aplicaciones Java EE (JBoss 4.2.3). Leí que el Java EE spec doesn't allow opening a socket from an enterprise bean. Pero la especificación no sugiere alternativas.¿Cómo servir un socket desde una aplicación Java EE?

Específicamente, los granos de la empresa no deben:

  • escuchar en, aceptar conexiones en, o multidifusión desde un enchufe de la red

Así que la pregunta es: ¿Qué puedo hacer para servir algunos binario tcp protocolos basados ​​(no http) desde dentro de un servidor de aplicaciones?

Here alguien sugiere implementar un resource adapter. ¿Es esta la forma en que tienes que ir o hay otras soluciones (más fáciles)?

Respuesta

1

Ahora mismo implemento una solución:

alt text http://yuml.me/7f82bd5c

que utiliza una aplicación Java independiente que acepta llamadas TCP desde el cliente y reenvía como JNDI llama al servidor de aplicaciones.

+2

Java Naming and Directory Interface (JNDI) Por lo general, realiza llamadas de búsqueda, puede buscar un ejb y realizar llamadas remotas para procesar los datos recibidos de su servidor independiente. – stacker

2

Tampoco hay que acceder a los archivos :(

Esto es porque en la especificación EJB tiene que ser:

  • distribuible (no se sabe de antemano en qué servidor/instancia se desplegará EJB
  • el contenedor es ser capaz de manejar "todo" lo que no debe generar sus propios hilos

esto en mente nada te detenga de startin ga socket del servidor en su aplicación (el mejor lugar probablemente sería en un servlet) pero debe tener cuidado acerca de cómo se cierra el servidor cuando su aplicación se apaga ...

7

Tiene razón, ya que puede declarar transacciones para todo en Java EE, deben ser compatibles con todos los componentes que desee conectar. Los archivos, si los hay, deben almacenarse en una base de datos. Todo debe ser controlado por el contenedor, ya que es la única forma de tener una aplicación de escalado utilizando Java EE.

algunas opciones:

  • implementar un conector (JCA) un ejemplo está aquí: http://www.theserverside.com/tt/articles/article.tss?l=J2EE1_4 clientes probablemente la mejor manera si ha existentes.

  • uso de Java colas de mensajes

  • La relación entre estas técnicas se discute aquí http://java.sun.com/products/jms/faq.html#relship_ejbs

  • servidor de escritura que almacena las solicitudes en la base de datos. (No hay soporte Tx)

  • Si tener solo un servidor y parece demasiada sobrecarga, puede ignorar estos aspectos de y seguir la sugerencia de Vinegars. Pero si necesita Tx más tarde o nodos adicionales , esta parte debe rediseñarse.

+1

+1: Gracias por el enlace al ejemplo de JCA. – tangens

+1

tenga en cuenta que este ejemplo de JCA es para JCA 1.5 y el artículo es de 2003. Esto cubre JCA 1.6 incluido en javaEE 6, esa versión es mucho menos amante de XML: http://www.oraclejavamagazine-digital.com/javamagazine/ 20120910 /? Pg = 56 & pm = 1 & u1 = friend # pg56 –

+1

Estoy probando un bean con Singleton y Startup y serializando eventos a través de Messages. Después de que @pgras comentó "Teniendo en cuenta que nada te detendrá de iniciar un socket de servidor en tu aplicación" parece bastante seguro. – stuartw

0

He utilizado una solución algo similar según mi necesidad en Spring MVC. Podría ser que esto puede ayudar a alguien aquí.

Inicie un puerto de socket en el inicio del servidor. Usé la anotación @scheduler mientras que también puedes usar la solución basada en oyentes. También puede implementar el oyente ApplicationContextAware y puede acceder a otros beans de aplicación desde él.

@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) 
public void startListenerPort() { 
    ServerSocket socket = new ServerSocket(9999); 
    // do some stuff here 
} 

Simplemente asegúrese de haber permitido el tráfico TCP en el puerto que ha asignado al Socket (Configuración del Firewall).

De esta manera, puede tener tráfico TCP en el puerto 9999, mientras que su servidor de aplicaciones continuará ejecutándose en un puerto diferente de forma normal.

0

Aunque no estrictamente una conexión puramente TCP, pero es posible que pueda lograr lo que necesita con una anotación @ServerEndpoint para crear un WebSocket a partir de la especificación Java EE7.

aunque esto utilizar HTTP, funcionará un poco como una interfaz binaria cuando su método @OnMessage y una ByteBuffer (o byte[]) como argumento.

Cuestiones relacionadas