Tengo un proyecto en el que vamos a tener cientos (potencialmente miles) de colas de conejo y de cada una de estas colas tendrá que ser consumido por un grupo de consumidores.
En el conejo (usando la primavera-amqp), que tiene la anotación rabbitlistener que me permite Asignación estática de las colas se encargará de esto consumidor en particular (s).
Mi pregunta es - con conejo y la primavera, hay una manera limpia para mí para agarrar una sección de colas (digamos colas que empiezan con corriente alterna) y luego también escuchar cualquier colas que se crean mientras que el consumidor se está ejecutando.
Ejemplo (en el arranque):
- hormiga-cola
- apple-cola
- cat-cola
Mientras que los consumidores se está ejecutando:
- Añadir murciélago cola
Aquí está el (muy simple) Código Actualmente tengo:
@Component
public class MessageConsumer {
public MessageConsumer() {
// ideally grab a section of queues here, initialize a parameter and give to the rabbitlistener annotation
}
@RabbitListener(queues= {"ant-queue", "apple-queue", "cat-queue"})
public void processQueues(String messageAsJson) {
< how do I update the queues declared in rabbit listener above ? >
}
}
Editar:
Debo añadir - He pasado por la documentación amqp primavera he encontrado en Internet y no he encontrado nada fuera de forma estática (ya sea a través de hardcoded o propiedades) declarar las colas
Inject (
@Autowired
o no) elRabbitListenerEndpointRegistry
.Obtener una referencia al contenedor oyente (utilizar el
id
atributo en la anotación para darle un ID conocido) (registry.getListenerContainer(id)
).Emitir el recipiente en una
AbstractMessageListenerContainer
y la llamada deaddQueues()
oaddQueueNames()
.
Tenga en cuenta que es más eficiente utilizar una DirectMessageListenerContainer
al añadir colas de forma dinámica; con un SimpleMessageListenerContainer
consumidor (s) se detiene y reinicia. Con el contenedor directa, cada cola obtiene su propio consumo (s).