복붙노트

[SPRING] 빈으로 새 대기열, 바인딩 및 교환을 동적으로 추가

SPRING

빈으로 새 대기열, 바인딩 및 교환을 동적으로 추가

나는 현재 rabbit-amqp 구현 프로젝트를 진행하고 있으며, Spring-rabbit을 사용하여 모든 대기열, 바인딩 및 교환을 프로그래밍 방식으로 설정합니다. (spring-rabbit-1.3.4 및 spring-framework 버전 3.2.0)

javaconfiguration 클래스 또는 xml 기반 구성의 선언은 내 의견으로는 꽤 정적입니다. 큐에 대해보다 동적 인 값 (예 : 이름)을 설정하는 방법을 알고 있습니다. 또는 바인딩이 같은 :

@Configuration
public class serverConfiguration {
   private String queueName;
   ...
   @Bean
   public Queue buildQueue() {
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
    buildRabbitAdmin().declareQueue(queue);
    return queue;
   }
   ...
}

하지만 Queue 및 Queue의 정의되지 않은 양을 생성 할 수 있는지 궁금합니다. 모든 인스턴스를 등록하는 팩토리처럼 bean으로 등록하십시오.

Spring @ Bean 어노테이션과 한계에 대해서는 잘 모르겠지만

@Configuration
public class serverConfiguration {
   private String queueName;
   ...
   @Bean
   @Scope("prototype")
   public Queue buildQueue() {
    Queue queue = new Queue(this.queueName, false, false, true, getQueueArguments());
    buildRabbitAdmin().declareQueue(queue);
    return queue;
   }
   ...
}

그리고 Queue의 여러 빈 인스턴스가 등록되어 있는지 확인하려면 다음을 호출하십시오.

Map<String, Queue> queueBeans = ((ListableBeanFactory) applicationContext).getBeansOfType(Queue.class);

그러나 이것은 단지 1 개의 매핑을 반환 할 것이다 :

name of the method := the last created instance.

런타임 중에 스프링을 SpringApplicationContext에 동적으로 추가 할 수 있습니까?

해결법

  1. ==============================

    1.컨텍스트에 Bean을 동적으로 추가 할 수 있습니다.

    컨텍스트에 Bean을 동적으로 추가 할 수 있습니다.

    context.getBeanFactory().registerSingleton("foo", new Queue("foo"));
    

    자동으로 관리자에 의해 선언되지는 않습니다. 컨텍스트에서 모든 AMQP 요소를 다시 선언하도록하려면 admin.initialize ()를 호출해야합니다.

    @Beans에서 이들 중 하나를 수행하지 않고 일반적인 런타임 Java 코드 만 수행합니다.

  2. from https://stackoverflow.com/questions/24241880/dynamically-add-new-queues-bindings-and-exchanges-as-beans by cc-by-sa and MIT license