Editar (2016-1-26): Los canales NO son seguros para hilos. La documentación de que ha cambiado entre April y May 2015. El nuevo texto:
casos canal no deben ser compartidos entre los hilos. Las aplicaciones deberían preferir usar un canal por subproceso en lugar de compartir el mismo canal en varios subprocesos. Si bien algunas operaciones en canales son seguras para invocar concurrentemente, algunas no lo son y resultarán en un entrelazado incorrecto de tramas en el cable. Compartir canales entre hilos también interferirá con * Publisher Confirms.
Desde su pregunta suena como usted no tiene un número predefinido y fijo de las discusiones que en su mayoría publicación/suscriben a RabbitMQ (en cuyo caso se podría considerar la creación de un canal como parte de la inicialización de la rosca , o usando un ThreadLocal<IModel>
).
Si las operaciones concurrentes de RabbitMQ son raras o el tamaño de los mensajes es siempre pequeño, puede salirse con la suya simplemente colocando un lock(channel)
alrededor de todas sus operaciones de pub/sub RabbitMQ. Si necesita que varias solicitudes se transmitan de forma intercalada (eso es lo que los canales son en primer lugar) mediante el uso de subprocesos arbitrarios, es posible que desee crear un grupo de canales , p. a ConcurrentQueue<IModel>
donde Encola los canales no utilizados y Dequeue durante el tiempo que los necesita. La creación de canales es muy baja-overhead, y tengo la sensación, a partir de pruebas de rendimiento, de que el proceso creación de canal no implica ninguna red io, es decir, parece que un canal se crea automáticamente en el servidor RabbitMQ en el primer uso por un cliente.
OLD (pre 01/26/2016): Los detalles ahora en su mayoría obsoletas del Java e implementaciones .net:
Re: canales y múltiples hilos, que es un poco confuso debido a su dependencia de la implementación.
implementación Java: Channels are thread safe:
casos de canal son seguros para su uso por varios subprocesos.
But:
confirma que no se manejan correctamente cuando un canal se comparte entre varios subprocesos
implementación de .NET: Channels are not thread safe:
Si hay más de un hilo necesita acceder a un particular I Instancias modelo, la aplicación debe imponer la exclusión mutua en sí misma.
Los síntomas de la serialización incorrecta de operaciones iModel incluyen, pero no se limitan a,
• secuencias de fotogramas no válidos que se envían en el cable
• NotSupportedExceptions que son lanzados ...
Así además de la útil respuesta de Robin, que se aplica independientemente de si es segura o no, en la implementación de .NET, no puede simplemente compartir una conexión.
Puede compartir una conexión. Usted "no puede" compartir un IModel (Canal) en la parte superior de una Conexión. – user2864740