2012-04-28 18 views
7

He estado tratando de compartir la conexión entre subprocesos y tener canales abiertos solo en la creación de subprocesos, pero después de investigar un poco más, creo que también quiero intentar connection pooling. ¿Cómo puedo hacer esto en rabbitmq? ¿o es esta una idea general que puedo aplicar en general? Mi objetivo es generar subprocesos X y luego no tener que abrir nuevos canales (lo que requiere el establecimiento de turnos entre el cliente y el servidor).¿Cómo puedo agrupar canales en rabbitmq?

Dado que los hilos son de su propia clase, no estoy seguro si tengo que poner el grupo en la clase en sí que genera los hilos o dónde van. También tengo varios tipos de hilos que me gustaría compartir estos conexiones entre (no solo una sola). ¿Es eso posible?

Sólo para dar una idea general, así es como conexiones/canales están en estblished RabbitMQ:

ConnectionFactory factory = new ConnectionFactory(); 
    factory.setHost("localhost"); 
    Connection connection = factory.newConnection(); 
    Channel channel = connection.createChannel(); //I want to share several of these between threads 

Respuesta

6

Todo lo que necesita es un conjunto de objetos Channel que sus hilos pueden tirar de.

Apache commons ya tiene un genérico ObjectPool que puede usar.

el Javadoc para la interfaz se puede encontrar aquí: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/ObjectPool.html

el Javadoc para uno de sus implementaciones pre-construidos se pueden encontrar aquí: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

Un tutorial para el uso que se puede encontrar aquí: http://commons.apache.org/pool/examples.html

Si esto es demasiado complicado para sus necesidades simples, realmente todo lo que necesita hacer es escribir una clase que administre un conjunto de objetos Channel, permitiendo que los hilos los revisen y los devuelvan al grupo, con la sincronización apropiada para evitar que dos hilos se agarren del mismo Channel

+0

Gracias, lo estudiaré para obtener más información, pero ¿se puede compartir el objeto compartido entre otras clases? Supongamos que tengo una clase que sube y otra que descarga; ¿pueden usar Canales del mismo objeto? – Lostsoul

+0

@Lostsoul - Ha pasado un tiempo desde que me deshice de conejos, pero si la clase 'Channel' se usa tanto para producir como para consumir, entonces sí. –

+0

Entendí que, lo que quería decir es si varias clases tienen acceso al mismo grupo de objetos o si necesito crear grupos de objetos para cada clase que vaya a usarlo. – Lostsoul

3

También puede usar el objeto ThreadLocal, en caso de que utilice los canales.

RabbitMq le aconseja utilizar canales por subproceso, por lo que sería una combinación perfecta.

Código de ejemplo:

private final ThreadLocal<Channel> channels = new ThreadLocal<>(); 
    ... 
    Channel channel = channels.get(); 
    if (channel == null){ 
      channel = connection.createChannel(); 
      channels.set(channel); 
     } 

hay necesidad de cerrar los canales, ya que estarán cerrados por su aplicación cuando se cierra la conexión. Aunque esta solución puede no ser adecuada para usted si está creando nuevos subprocesos ya que eso asignará muchos canales nuevos que nunca se cerrarán. Pero si haces algo así, probablemente estés haciendo algo mal.

Cuestiones relacionadas