2017-11-16 27 views
1

런타임시 이것을 구성하는 가장 쉬운 방법은 무엇입니까?런타임시 @RabbitListener를 생성하는 가장 쉬운 방법

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(value = "providedAtRuntime", durable = "true"), 
    exchange = @Exchange(value = "providedAtRuntime", ignoreDeclarationExceptions = "true"), 
    key = "providedAtRuntime"), containerFactory = "cFac") 
public class RabbitProcessor { 
    @RabbitHandler 
    public void receive (String smth){ 
     System.out.println(smth); 
    } 
} 

리스너를 정의하고 싶지만 런타임에 교환, 큐 이름 및 바인딩을 제공하고 싶습니다. 또한이 리스너는 자동으로 시작되지 않아야하지만 start() 메서드에 의해 호출되면 자동으로 시작됩니다. 동시에 바인딩 및 대기열 등을 자동 선언해야합니다. stop()이라고 불리면 소비가 중지됩니다.

+0

이 함께 테스트? https://stackoverflow.com/questions/14268981/modify-a-class-definitions-annotation-string-parameter-at-runtime – Eugene

답변

4

주석이있는 것은 불가능하다고 생각하지만 맞춤 SimpleMessageListenerContainer을 만들 수 있습니다.

여기에 간단한 솔루션입니다 :

public static AbstractMessageListenerContainer startListening(RabbitAdmin rabbitAdmin, Queue queue, Exchange exchange, String key, MessageListener messageListener) { 
    rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(key).noargs()); 
    SimpleMessageListenerContainer listener = new SimpleMessageListenerContainer(rabbitAdmin.getRabbitTemplate().getConnectionFactory()); 
    listener.addQueues(queue); 
    listener.setMessageListener(messageListener); 
    listener.start(); 

    return listener; 
} 

당신은 그것을 호출 할 수 있습니다 :

ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args); 

ConnectionFactory connectionFactory = ctx.getBean(ConnectionFactory.class); 
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); 
AbstractMessageListenerContainer container = startListening(rabbitAdmin, rabbitAdmin.declareQueue(), 
     new DirectExchange("amq.direct"), "testRoute", message -> { 
      System.out.println(new String(message.getBody())); 
     }); 

그리고 할 수 있습니다

AbstractMessageListenerContainer.destroy() 또는 AbstractMessageListenerContainer.stop()을.

봄 부팅 1.5.8.RELEASE 및 RabbitMQ 3.6.10

+0

감사. 나는이 접근법을 알고 있었다. 방금 rabbitAdmin을 직접 사용하지 않고도 이보다 더 쉬운 것이 있는지 확인하고 싶었습니다. – bojanv55

+1

아니, 단지 불가능하거나 효율적이지 않기 때문에 아무것도 없습니다. –

+0

@Artem Bilan - 대기열, 교환 및 바인딩이 연결이 끊어지면 다시 선언된다는 보장이 있습니까? 리스너 컨테이너가 자동으로 다시 연결됩니까? – bojanv55