Clientes atascados en la creación de sesiones

Tengo una red de 3 corredores en ejecución, pero a veces los corredores fallan de una manera bastante única y molesta.

Todavía aceptan conexiones pero, por lo demás, se detienen para comunicarse con el cliente (incluso aquellos que aún están conectados). Para nuevas conexiones creadas en java, esto significa:

con = factory.getConnection(); // method returns, connection is created
con.createSession(false, Session.AUTO_ACKNOWLEDGE); // never returns

en el lado del servidor no hay excepciones registradas cuando se ejecuta en modo de depuración.

¿Tienes idea de lo que pasa aquí? ¿Hay algún mensaje de registro que pueda buscar?

EDITAR: alguna información adicional:

  • http://pastebin.com/9iztG67D - archivo de configuración xml
  • cada nodo es un nodo maestro con un esclavo conectado (maestro esclavo puro)
  • client uri: failover:(tcp://serverA:61616,tcp://serverB:61616,tcp://serverC:61616,tcp://serverA-Slave:61616,tcp://serverB-Slave:61616,tcp://serverC-Slave:61616)?randomize=false

preguntado el 02 de febrero de 12 a las 11:02

probablemente este no sea el caso, pero solo para asegurarse, ¿libera espacio / ram / cpu ... etc en la CAJA? -

¿Está utilizando la conmutación por error en el URI de conexión del cliente? Agregue más información sobre la configuración del cliente. -

@Laures Hola, necesito mucho tu ayuda. Consulte esta pregunta para la integración del servicio de descanso de camisetas y Activemq. stackoverflow.com/questions/19706788/… -

2 Respuestas

Sin saber más sobre cómo están configurados sus corredores y qué tipo de estructura de cola / tema está utilizando, es un poco difícil saber exactamente qué está sucediendo. Pero según el comportamiento general que describió, esto suena a control de flujo en algún nivel.

Mira aquí para una explicación más detallada del control de flujo. Básicamente, si tiene un destino que se está llenando y está alcanzando su límite de memoria debido a un consumidor lento / pendiente, el corredor puede dar la apariencia de "bloquearse" cuando los nuevos productores intentan enviar mensajes.

Los corredores también pueden bloquearse de formas extrañas cuando se alcanzan los límites de memoria del sistema. Consulte sus valores de configuración para:

<systemUsage>
  <systemUsage>
    <memoryUsage>
      <memoryUsage limit="64 mb" />
    </memoryUsage>
    <storeUsage>
      <storeUsage limit="100 gb" />
    </storeUsage>
    <tempUsage>
      <tempUsage limit="10 gb" />
    </tempUsage>
  </systemUsage>
</systemUsage>

La forma más sencilla de identificar este tipo de problema es utilizar un cliente JMX, como jconsole, conectarse a los intermediarios e inspeccionar el uso actual de la memoria en relación con sus límites, para diferentes destinos y el intermediario en general.

Respondido 02 Feb 12, 18:02

agregué mi configuración de corredor. el control de flujo es falso y no se alcanzaron los límites de uso del sistema. - Laures

Dado que no ha mostrado cómo se ve el URI del cliente, no es fácil decir cuál es el problema exacto. El bloqueo del cliente que describió puede ocurrir si está utilizando la conmutación por error en la uri del cliente y el cliente no puede conectarse al intermediario. La llamada a createSession básicamente dispara una condición que hace que el cliente comience su intercambio de comandos de protocolo con el servidor y si la conexión no se puede realizar, la llamada se bloqueará hasta que el transporte de conmutación por error pueda crear una conexión.

Respondido 03 Feb 12, 23:02

de acuerdo con el lado del cliente que registra los registros de conmutación por error que se conectó al primer corredor de la lista y los registros de mi cliente que devolvió getConnection pero no registra que devuelve createSession. Además, cuando el corredor falló así, la última vez nos dimos cuenta de que la conexión creada no se puede cerrar. esto también bloquea. - Laures

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