NECESITO CREAR UN LISTENER EN JAVA

Hola muchachos soy novato total en cuestiones de listener y mi primer tarea en mi nuevo trabajo es crear un listerner , para reemplazar el listener actual hecho en .net yo sugeri hacerlo en java y pues les comento u poco como es que se trabaja porque el listener tienen que ser algo muy efeciente.

el trabajo es una casa de apuestas que cuenta con 2500 puntos de ventas en todo el pais... cada punto de venta cuenta con uno o dos pc y en el se encuetra el sw cliente java que realiza las apuestas.... aparte de esos 2500 puntos de ventas se cuenta con 800 terminales con conexion grps que son esas maquinitas que ves en los supermercados de cadenas o restaurates donde pasa la tarjeta de credito y pagas en cualquier sitio... el problema de esas maquinitas actualmente es que cuando se conecta al socket esa conexion se deja abierta siempre ya que en ellas segun me explica el ing es muy costoso que cierren la conexion ya que el proceso conexion y desconexion consume timpo critico en dichosos aparatos. todo esas peticiones va al listener y el listener se comunica con la base datos que es oracle, al parecer hay dos instancias de la base de datos.

la idea muchacho esque me indique como debo debo hacer el listener para soportar todas esas conexiones, que seria lo mas recomendable un listener.. varios listener??? creo que actualmente en la empresa se manejas 10 o 12 listener diferentes y no se porque ???? necesito que me indiquen como debo empesar a desarrollas que debo tener en cuenta y lo que voy programando lo voy subiendo a ver que tal. bueno muchahos saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

PRIMERA APROXIMACION DEL SERVER

 

Imagen de tuxin39

Listener

Hola Hacman, puede llegar a ser un tema para hacer una tesis te digo porque: mucho de los éxitos de un switch's transaccional están detrás de algoritmos y estructuras eficientes, optimas para aceptar N cantidad de conexiones lo más rápido posible , y que tenga buen performance, no solo es lis tener, sino que el protocolo de envío y recepción de los datos, para que esté sea eficiente, el tratamiento de los datos (listas, ring-buffer, etc.). Y puedes incluso llegar a utilizar balanceadores de carga con apache, o algún hardware F5, para levantar varias instancias de tu listener. En este foro han echo muchas contribuciones valiosísimas sobre alguno de los temas que te mencione arriba, por ejemplo :

Lo que puedo concluir separando un poco, un buen servidor se puede obtener de la siguiente forma :

1.- A nivel conexión : balanceador de carga
2.- A nivel Socket puede ser concurrente o como mencionas una sola conexión sostenida. Pero lo que hace realmente poderoso esto es el protocolo que utilices para recibir y enviar los arreglos, ya que si sostienes una conexión hay que programar el loop que acepte el protocolo y separa las tramas que recibes por el socket.
3.- El algoritmo de tratamiento ve Disruptor.
4.- Analizar el consumo de memoria, tiempo de respuesta y uso de procesador de la aplicación. Tratar de que las utilidades de tu aplicación y requerimientos no funcionales (LOGs) sean desatendidos , no bloqueantes y ligeros.

Si tienes especial cuidado con estos puntos, puedes tener una aplicación robusta.

Saludos

ok tuxin39

todos tus puntos los voy a tener en cuenta muchas gracias por comentar, muchas gracias por compartir el conocimiento be free!!

Imagen de tuxin39

Listener

Un poco de pseudocódigo:
 
Donde:
aceptaProtocol (Cadena) // Acepta una cadena y revisa si cumple el protocolo propietario que se defina, para llevar un orden.

Es muy recomendable que lo primero que viaje en tu cadena sea la longitud, de echo el pseudocódigo optimizado quedaría con dos read, uno para leer la longitud de tu cadena y otro para identificar de que se trata, la longitud es importante cuando hay mucho stress, ya que si hay mucha carga los mensajes se traslapan , quedaría algo así, si quieremos leer "Hello world", el cliente enviaría: "011Hello world":
 
Y así no hay pierde, no vas a tener remanentes.

Saludos

AQUI VA UN EJEMPLO SOCKETS HILO POR CONEXION SERVIDOR

 

Esta server es funcional

despues de testear el server funciona muy bien con
 

EL CLIENTE

 

Alguien que me de concesos para mejorar este socket

Aqui por ahora hace su trabajo es un socket hilo por conexion, nose habra que añadir o quitar para tranaformarlo a un thread pool, el cliente tiene a ui como un chat , pero solo funciona el boton de conecta que es para probar envio de mensajes desde cleinte al serve y iceversa espero comentaris que me puedan ayudar mucho se cuidan bye...

REALMENTE NECESITO UN CONSEJO???

ya tengo mi socket listener en hilo x conexion hay que que me de ideas de como desarrollar uno con thread pool???

Imagen de ezamudio

Thread Pool

Es muy fácil, necesitas tener un hilo dedicado al ServerSocket para aceptar conexiones contínuamente (como seguramente ya lo debes tener ahorita), pero en vez de que después del   arranques un hilo dedicado para manejar el Socket recién recibido, vas a crear un Runnable que metes al thread pool.

Por eso se recomienda NO extender la clase Thread, sino implementar la interfaz Runnable; imagínate que tu esquema de hilo x conexión lo hiciste con un Runnable:

 

Si implementas eso, entonces en tu esquema de hilo x conexión original estarías haciendo algo así:

 

Y ahora lo único que necesitas hacer es:

 

Eso es todo.

IMPORTANTE: La cosa aquí es que configures bien tu thread pool, poniéndole un límite al número de hilos que puede crear, y tomando en cuenta que si llegan más conexiones que ese límite que fijaste, se van a encolar y se ejecutarán hasta que se terminen las que están ejecutándose.

Por ejemplo si creas tu thread pool con un límite de 4 hilos y te llegan de repente 8 conexiones, las 8 se encolan pero pues se ejecutarán máximo 4 de manera simultánea (o casi simultánea) y las otras 4 estarán esperando; cuando se libere uno de esos 4 hilos porque la conexión se termina de procesar (tu Runnable termina), la siguiente conexión encolada se procesará y así con cada una de las que queden. El truco aquí ya es de tuning porque hay que poner suficientes hilos como para que se puedan atender todas las conexiones de manera que no esperen demasiado, pero sin que se haga un hilo por cada una porque entonces no hay diferencia de manejar hilo por conexión (bueno más que el reuso de los hilos).

Para ponerle límite al cached thread pool:  

Ok voy a revisar

ezamudio muchas gracias por comentar me has ayudados mucho voy a trabajar en ello y posteo como me fue

COMO TRATAR LAS ENTRDAS QUE LLEGAN DEL SERVER

Tengo una clase que se llama ListenerSocket y ellas es la encargada de esperar todo lo que llega del server dicha clase implementa Runnable:

la idea es que la trama que me llegue del servidor la trate y la envie tratata a donde la necesito que es una clase controladora, trate de crear una clase Singlenton pero cuando intento acceder supuetstamente la trama me da Null PointerException
asi tengo el codigo en el controler:

------------------------CODIGO DESDE EL CONTROLER--------------------------

 

ESTE ES UN FRACMENTO DEL ESCUCHADOR EL QUE ESPERA Y RECIBE LOS DATOS DEL SERVER

 

Imagen de echan

esta chamba se ve muy low

esta chamba se ve muy low level para hacerlo a patin, no has considerado usar algo netty? todas las broncas de conexion, condificar-decodifcar mensajes, que si el protocolo y el numero de clientes, etc.. es precisamente lo que hace este framework.

Alo mejor hay que invertirle tiempo a los conceptos pero para que reinventar la rueda? mira los ejemplos

echan netty

quiero aprender a montarlo yo, creo que es mejor manejar este tema a mano ya que asi lo confiuras exactamente a como lo necesitas

CLASE OBSERVABLE

estoy leyendo sobre el patron observador parece que es por ahi la cosa no se que opinan ustedes???

PASE LA INSTANCIA DEL CONTROLER A LA CLASE ListenerSoCKET

espero que este bien hecho y fue la primera solucion que me resulto

 

de este modo funciona

 
}

que diferencia???

ExecutorService newFixedThreadPool(int nThreads) y ExecutorService tpool = Executors.newCachedThreadPool();

Imagen de ezamudio

número de hilos

Lee la documentación de esos métodos.