Estado en línea de ejabberd cuando el usuario pierde la conexión

Tengo la configuración de ejabberd para ser el servidor xmpp entre aplicaciones móviles, es decir. Aplicación personalizada para iPhone y Android.

Pero aparentemente me he topado con una limitación de la forma en que ejabberd maneja los estados en línea.

Guión:

El usuario A está enviando mensajes al usuario B a través de sus teléfonos móviles.El usuario B pierde toda la conectividad, por lo que el cliente no puede desconectarse del servidor.ejabberd aún enumera al usuario B como en línea.Como ejabberd asume que el usuario B aún está en línea, cualquier mensaje del usuario A se transmite a la conexión muerta.Por lo tanto, el usuario B no recibirá el mensaje, ni se guardará como un mensaje sin conexión, ya que ejabberd asume que el usuario está en línea.Mensaje perdido.Hasta que ejabberd se da cuenta de que la conexión está obsoleta, la trata como un usuario en línea.

Y agregue cambios en la conexión de datos (wifi a 3G a 4G a ...) y encontrará que esto sucede bastante.

mod_ping:

Intenté implementar mod_ping en un intervalo de 10 segundos.
https://www.process-one.net/docs/ejabberd/guide_en.html#modping
Pero como indica la documentación, el ping esperará 32 segundos para recibir una respuesta antes de desconectar al usuario.
Esto significa que habrá una ventana de 42 segundos donde el usuario puede perder sus mensajes.

Solución ideal:

Incluso si el tiempo de espera de ping podría reducirse, todavía no es una solución perfecta.
¿Hay alguna forma en que ejabberd pueda esperar una respuesta 200 del cliente antes de descartar el mensaje? Si no hay respuesta, guárdelo sin conexión.
¿Es posible escribir un gancho para resolver este problema?
¿O hay un ajuste simple que me he perdido en algún lugar?

Para tu información: No estoy usando BOSH.

Respuestas a la pregunta(6)

Su respuesta a la pregunta