Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

473
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!