Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

317
Vistas
¿Qué es MultiServerUserRegistry en spring websocket?

En el paquete org.springframework.messaging.simp.user hay una clase MultiServerUserRegistry .

Parece que esta clase funcionaría en una aplicación multiservidor, pero no pude encontrar ninguna documentación que pudiera ayudarme a comprender cómo funciona o cómo debo usarla.

¿Qué hace esta clase y cómo la uso? ¿Cómo uso websocket para trabajar en una aplicación multiservidor?

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

El mecanismo de publicación predeterminado utiliza un repositorio de sesiones locales para resolver el ID de socket de un usuario.
Si está configurando un clúster, no puede usar esta estrategia. Necesitamos usar un repositorio remoto.
El removeRepository ya existe en Spring como MultiServerUserRegistry. Para activarlo solo tienes que configurar tu MessageBrokerRegistry:

 registry.enableStompBrokerRelay("/topic/", "/queue/", "/exchange/") .setUserDestinationBroadcast("/topic/unresolved-user") .setUserRegistryBroadcast("/topic/user-registry")

Funciona bien para mí. Espero que ayude.

about 4 years ago · Santiago Trujillo Denunciar

0

Según el JavaDoc de MultiServerUserRegistry, es una implementación de SimpUserRegistry, que nos permite buscar registros de usuarios locales y remotos.

SimpUserRegistry que busca usuarios en un registro de usuarios "local", así como en un conjunto de registros de usuarios "remotos". El registro local se proporciona como un argumento del constructor, mientras que los registros remotos se actualizan mediante difusiones gestionadas por UserRegistryMessageHandler, que a su vez notifica a este registro cuando se reciben actualizaciones.

Otra implementación de SimpUserRegistry es DefaultSimpUserRegistry, que solo puede obtener usuarios locales.

Leí el código fuente relacionado sabiendo que cuando configuramos setUserRegistryBroadcast en enableStompBrokerRelay, se creará un MultiServerUserRegistry y podemos obtener el estado en línea de todos los usuarios, independientemente del servidor que conectaron en el clúster.

Aquí está el código fuente clave en AbstractMessageBrokerConfiguration:

 @Bean @SuppressWarnings("deprecation") public SimpUserRegistry userRegistry() { SimpUserRegistry registry = createLocalUserRegistry(); if (registry == null) { registry = createLocalUserRegistry(getBrokerRegistry().getUserRegistryOrder()); } boolean broadcast = getBrokerRegistry().getUserRegistryBroadcast() != null; return (broadcast ? new MultiServerUserRegistry(registry) : registry); }

Como esta función anotada con @Bean, podemos obtener la instancia de SimpUserRegistry mediante @Autowired:

 @Autowired private SimpUserRegistry simpUserRegistry;

Usando esta interfaz, tenemos la capacidad de:

 /** * Get the user for the given name. * @param userName the name of the user to look up * @return the user, or {@code null} if not connected */ @Nullable SimpUser getUser(String userName); /** * Return a snapshot of all connected users. * <p>The returned set is a copy and will not reflect further changes. * @return the connected users, or an empty set if none */ Set<SimpUser> getUsers(); /** * Return the count of all connected users. * @return the number of connected users * @since 4.3.5 */ int getUserCount(); /** * Find subscriptions with the given matcher. * @param matcher the matcher to use * @return a set of matching subscriptions, or an empty set if none */ Set<SimpSubscription> findSubscriptions(SimpSubscriptionMatcher matcher);

Podemos usarlo para obtener el recuento de todos los usuarios en línea (por getUserCount ) en todo nuestro clúster y detectar si un usuario específico está en línea o no (por getUser ).

Como mi práctica, se sugiere la siguiente configuración del agente de mensajes en el escenario de varios servidores:

 @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); registry.enableStompBrokerRelay("/topic", "/queue") .setUserDestinationBroadcast("/topic/log-unresolved-user") .setUserRegistryBroadcast("/topic/log-user-registry") .setRelayHost(brokerConfig.getHost()) .setRelayPort(brokerConfig.getPort()) .setVirtualHost(brokerConfig.getVirtualHost()) .setClientLogin(brokerConfig.getUsername()) .setClientPasscode(brokerConfig.getPassword()) .setSystemLogin(systemUsername) .setSystemPasscode(systemPassword); }
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda