Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

479
Visualizações
¿Habilitar y deshabilitar mediante programación ciertos @RabbitListener en Spring?

Tengo una clase A que publica el evento E1. E1 es consumido por la clase B en la misma aplicación que está anotada con @RabbitListener . B hace algunas cosas y luego publica el evento E2 que es consumido por C, etc., etc. (formando una cadena de procesos).

Lo que quiero hacer son dos cosas:

  1. Quiero probar A en una prueba de integración, pero mientras lo hago, me gustaría deshabilitar RabbitListener's para que no se ejecute todo el proceso que es el resultado de la publicación de E1. Solo quiero afirmar que A hace lo que se supone que debe hacer y publica E1. Me las arreglé para acomodar esto configurando spring.rabbitmq.listener.auto-startup=false .
  2. También quiero probar B en una prueba de integración mediante la publicación de E1 en RabbitMQ para poder estar seguro de que configuré el RabbitListerner de B correctamente. Pero nuevamente, no quiero que se llame a C como un efecto secundario de la publicación de E2.

Sé que probablemente pueda hacer esto usando simulacros, pero preferiblemente me gustaría probar el trato real y usar los componentes reales (incluido el envío del mensaje a una instancia real de RabbitMQ que, en mi caso, se ejecuta en Docker).

¿Puedo lograr esto de una manera agradable en Spring Boot? ¿O tal vez se recomienda usar @RabbitListenerTest y, de hecho, usar simulacros?

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

@RabbitListener tiene la propiedad id :

 /** * The unique identifier of the container managing for this endpoint. * <p>If none is specified an auto-generated one is provided. * @return the {@code id} for the container managing for this endpoint. * @see org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry#getListenerContainer(String) */ String id() default "";

Y ese RabbitListenerEndpointRegistry#getListenerContainer(String) devuelve MessageListenerContainer y allí ya puede controlar start()/stop() del controlador @RabbitListener individual.

about 4 years ago · Santiago Trujillo Relatório

0

Una idea de seguimiento de la respuesta aceptada es tener algún tipo de BaseAmqpIntegrationTest abstracto que haga lo siguiente:

 public abstract class BaseAmqpIntegrationTest { @Autowired protected RabbitListenerEndpointRegistry rabbitListenerEndpointRegistry; @BeforeEach protected void setUpBeforeEach() { rabbitListenerEndpointRegistry.getListenerContainers() .forEach(Lifecycle::stop); getRequiredListenersToStart().forEach(listener -> rabbitListenerEndpointRegistry.getListenerContainer(listener) .start()); } protected abstract List<String> getRequiredListenersToStart(); }

Esto lo hace reutilizable y garantiza que todos los @RabbitListener estén deshabilitados "de forma predeterminada" y requiere que cada prueba habilite explícitamente a los oyentes que prueba. Las subclases de prueba pueden anular simplemente getRequiredListenersToStart() para proporcionar los ID de los @RabbitListener que requieren.

PD: Limpiarlo, por supuesto, también funcionaría:

 public abstract class BaseAmqpIntegrationTest { @AfterEach protected void cleanUpAfterEach() { rabbitListenerEndpointRegistry.getListenerContainers() .forEach(Lifecycle::stop); } }

O un poco más detallado:

 public abstract class BaseAmqpIntegrationTest { @AfterEach protected void cleanUpAfterEach() { getRequiredListenersToStart().forEach(listener -> rabbitListenerEndpointRegistry.getListenerContainer(listener) .stop()); } }
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda