¿Cuáles son buenas fuentes para estudiar la implementación de subprocesos de una aplicación XMPP?
-
01-07-2019 - |
Pregunta
Según tengo entendido, el protocolo XMPP se basa en una conexión siempre activa en la que no se tiene ninguna indicación inmediata de cuándo finaliza un mensaje XML.
Esto significa que tienes que evaluar la transmisión tal como viene.Esto también significa que, probablemente, tenga que lidiar con conexiones asincrónicas ya que el socket puede bloquearse en medio de un mensaje XML, ya sea debido a la longitud del mensaje o a que la conexión sea lenta.
Agradecería una fuente por respuesta para que podamos modificarlas y ver cuál es la favorita.
Solución
¿Quieres lidiar con múltiples conexiones a la vez?En ese caso, es imprescindible un buen procesamiento de sockets asíncronos para evitar un subproceso por conexión.
De lo contrario, sólo necesita un analizador XML que pueda manejar una gran cantidad de bytes a la vez. expatriado es el ejemplo canónico;si estás en Java, prueba experiencia.Estos tipos de analizadores XML activarán tantos eventos como sea posible y almacenarán en buffer estrofas parciales hasta que llegue el resto.
Ahora, para abordar su afirmación de que no hay notificación cuando un estrofa termina, eso no es realmente cierto.Lo importante es no procesar el flujo XML como si fuera una secuencia de documentos.Utilice el siguiente pseudocódigo:
stanza = null
while parser has more:
switch on token type:
START_TAG:
elem = create element from parser state
if stanza is not null:
add elem as child of stanza
stanza = elem
END_TAG:
parent = parent of stanza
if parent is not null:
fire OnStanza event
stanza = parent
Este enfoque debería funcionar con un analizador de extracción o basado en eventos.Solo requiere aferrarse a un indicador de estado.Obviamente, también necesitarás manejar atributos, datos de caracteres, referencias de entidades (como &y similares) y la etiqueta stream:stream con un propósito especial, pero esto debería ayudarte a comenzar.
Otros consejos
Igniterealtime.org proporciona un servidor y cliente XMPP de código abierto escrito en java
ejabberd está escrito en Erlang.No conozco los detalles de la implementación de ejabberd, pero una ventaja de usar Erlang son los subprocesos realmente económicos.Especularé que inician un hilo por conexión XMPP.En la terminología de Erlang, estos se denominarían procesos, pero no son espacios de direcciones de memoria protegida, sino subprocesos ligeros de espacio de usuario.