Uso de sesión de cliente JMS

Estoy intentando utilizar el cliente .NET Kaazing para interactuar con un back-end JMS a través de sockets web. Me cuesta entender el uso correcto de las sesiones. Inicialmente, tenía una sola sesión compartida en todos los hilos, pero noté que esto era No se admite:

Un objeto de sesión es un contexto de un solo subproceso para producir y consumir mensajes. Aunque puede asignar recursos del proveedor fuera de la máquina virtual Java (JVM), se considera un objeto JMS ligero.

La razón por la que tuve una sola sesión fue porque pensé que eso produciría un mejor rendimiento. Dado que la documentación afirmaba que las sesiones eran livianas, no dudé en cambiar mi código para usar una sesión por "operación". Por "operación" me refiero a enviar un solo mensaje o suscribirse a una cola/tema. En el primer caso, la sesión dura poco y se cierra inmediatamente después de enviar el mensaje. En este último caso, la sesión debe vivir mientras la suscripción esté activa.

Cuando intenté crear varias sesiones, recibí un error:

System.NotSupportedException: Only one non-transacted session can be active at a time

Buscar en Google este error fue infructuoso, así que intenté cambiar a sesiones de transacciones. Pero cuando intento crear un consumidor, aparece un error diferente:

System.NotSupportedException: This operation is not supported in transacted sessions

Así que parece que estoy atrapado entre la espada y la pared. Las únicas opciones posibles que veo son compartir mi sesión a través de subprocesos o tener una única sesión sin transacciones para crear consumidores y varias sesiones con transacciones para todo lo demás. Ambos enfoques me parecen un poco contra la corriente.

¿Alguien puede arrojar algo de luz sobre la forma correcta de manejar las sesiones en mi cliente?

preguntado el 12 de junio de 12 a las 10:06

1 Respuestas

Hay varias formas de agregar concurrencia a su aplicación. Podría usar varias conexiones, pero probablemente no sea deseable debido a un aumento en la sobrecarga de la red. Sería mejor implementar un mecanismo simple para manejar la concurrencia en Message Listener mediante el envío de tareas o la entrega de mensajes a través de ConcurrentQueues. Aquí hay algunas opciones para la estrategia de implementación:

  1. El enfoque basado en tareas usaría un TaskScheduler. En MessageListener, se programaría una tarea para manejar el trabajo y regresar de inmediato. Puede programar una nueva tarea por mensaje, por ejemplo. En este punto, el MessageListener regresaría y el siguiente mensaje estaría disponible de inmediato. Este enfoque estaría bien para aplicaciones de bajo rendimiento, por ejemplo, unos pocos mensajes por segundo, pero donde necesita concurrencia quizás porque algunos mensajes pueden tardar mucho tiempo en procesarse.

  2. Otro enfoque sería utilizar una estructura de datos de mensajes para el trabajo pendiente (Cola simultánea). Cuando se invoca MessageListener, cada mensaje se agregaría a ConcurrentQueue y regresaría inmediatamente. Luego, un conjunto separado de subprocesos/tareas puede extraer los mensajes de ese ConcurrectQueue utilizando una estrategia adecuada para su aplicación. Esto funcionaría para una aplicación de mayor rendimiento.

  3. Una variación de este enfoque sería tener un ConcurrentQueue para cada subproceso que procesa los mensajes entrantes. Aquí, MessageListener no administraría su propia ConcurrentQueue, sino que entregaría los mensajes a ConcurrentQueue asociados con cada subproceso. Por ejemplo, si tiene mensajes entrantes que representan feeds de stock y también feeds de noticias, un subproceso (o conjunto de subprocesos) podría procesar los mensajes de feed de stock y otro podría procesar las noticias entrantes por separado.

Tenga en cuenta que si está utilizando JMS Queues, cada mensaje se reconocerá implícitamente cuando regrese su MessageListener. Este puede o no ser el comportamiento que desea para su aplicación.

Para aplicaciones de mayor rendimiento, debe considerar los enfoques 2 y 3.

Respondido el 12 de junio de 12 a las 16:06

Gracias por la respuesta, pero realmente no abordas mi pregunta. No entiendo cuándo y cómo crear sesiones - el manejo simultáneo de los mensajes recibidos no es mi problema. Mi enfoque actual es crear una sesión única, de larga duración y sin transacciones a partir de la cual se crean todos los consumidores. Luego, para cada mensaje que necesito enviar, creo una sesión transaccional de corta duración con la que enviar el mensaje. Esto parece funcionar, pero también parece bastante complicado. ¿Puede comentar sobre mi enfoque? - Kent Boogaart

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.