Eu tenho um projeto onde nós estamos indo ter centenas (potencialmente milhares) de filas em coelho e de cada uma dessas filas precisará ser consumida por um pool de consumidores.
No coelho (usando primavera-AMQP), você tem a anotação rabbitlistener que me permite atribuir estaticamente as filas esse consumidor particular (s) irá lidar.
A minha pergunta é - com coelho e na primavera, há uma maneira limpa para me para pegar uma seção de filas (digamos filas que começam com ac) e depois também ouvir para todas as filas que são criadas, enquanto o consumidor está em execução.
Exemplo (no início):
- formiga-fila
- maçã-fila
- cat-fila
Enquanto consumidor está em execução:
- Adicionar bat-fila
Aqui está o código (muito simples) Eu tenho atualmente:
@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:
Devo acrescentar - Eu tenho ido através da documentação primavera AMQP I encontrados on-line e eu não ter encontrado fora nada de estaticamente (ou codificado ou através de propriedades) declarando as filas
Injectar (
@Autowired
ou de outra forma) aRabbitListenerEndpointRegistry
.Obter uma referência para o recipiente ouvinte (usar o
id
atributo na anotação para dar-lhe um ID conhecida) (registry.getListenerContainer(id)
).Lançar o recipiente em uma
AbstractMessageListenerContainer
e chamadaaddQueues()
ouaddQueueNames()
.
Note-se que é mais eficiente usar um DirectMessageListenerContainer
quando a adição de filas de forma dinâmica; com um SimpleMessageListenerContainer
consumidor (s) são parados e reiniciado. Com o recipiente direta, cada fila recebe o seu próprio consumo (s).
Consulte Escolhendo um recipiente .