2

Entegrasyon akışları RabbitMQ kuyrukları ile başlayan bir Spring Boot/Entegrasyon uygulamasına sahibim. Kendileri ve genel olarak uygulama akışları iyi çalışıyor, ancak başlangıç ​​gelen AMQP yapılandırması için çok fazla konfigürasyon var.Entegrasyon akışlarına eşleme bahar yapılandırması

Şu anda, her biri çalışma zamanında tanımlanması gereken, biraz değişken özelliklere sahip on adet DataType s var. Her biri için bir gelen akışı başlatıyorum, birkaç üstbilgi ayarlıyorum ve bunları işlemek için ortak bir kanala hızla döküyorum. Başka dokuz paralel yapılandırma yoktur

@Bean 
public IntegrationFlow inboundNetworkDiagnosticFlow(@Qualifier("connectionFactory") ConnectionFactory connectionFactory, 
                @Qualifier(BeanNames.INBOUND_EVENTS_CHANNEL) MessageChannel outbound, 
                @Qualifier(BeanNames.JSON_NODE_MESSAGE_CONVERTER) MessageConverter messageConverter, 
                @Qualifier("networkDiagnosticQueue") Queue queue, 
                @Value("${networkDiagnostic.numConsumers}") int numConsumers, 
                @Value("${networkDiagnostic.prefetchCount}") int prefetchCount) { 
    return makeEventIntegrationFlow(connectionFactory, outbound, messageConverter, queue, numConsumers, prefetchCount, 
      DataTypes.EVENT_NETWORK_DIAGNOSTIC); 

} 

@Bean 
public Binding networkDiagnosticBinding(@Qualifier("networkDiagnosticQueue") Queue queue) { 
    return makeFanoutBinding(queue, NETWORK_DIAGNOSTIC_EXCHANGE_NAME); 
} 


@Bean 
public Queue networkDiagnosticQueue() { 
    return makeQueue(NETWORK_DIAGNOSTIC_QUEUE_STRING); 
} 

@Bean 
public FanoutExchange networkDiagnosticExchange() { 
    return new FanoutExchange(NETWORK_DIAGNOSTIC_EXCHANGE_NAME); 
} 

: gibi sadece birNetworkDiagnosticDataType ait için

Java yapılandırma görünüyor. Bunu daha fazla hesaba katmak isterim, böylece a) tekrarı kaldırılır ve b) sunucudaki bir yapılandırma dosyasından daha fazla giriş yapılandırılabilir.

/** 
* Organizes information and configuration for a DataType 
*/ 
public class DataType { 
    private String name; 
    private Schema schema; 
    private WindowType windowType; 
    private long bucketLength; 

    private String exchange; 
    private String routingKey; 
    ... 

Ve ben:

data_types: 
    - name: network-diagnostic 
    schema: event 
    window_type: hourly 
    exchange_name: blahblahblah 
    queue_name: blahblahblah 
    ... 
    - name: log-diagnostic 
    ... 

@ConfigurationProperties aracılığıyla, ben az çok benzer bir sınıfa map ediyorum:

Benim genel düşünce ben yaml yapılandırma dosyasına sahip olduğunu ifade etti Gerekli tüm çekirdeklerin (ve bunların karşılıklı ilişkilerinin) tümünü oluşturan ve her birine SingletonBeanRegistry::registerSingleton numaralı telefonu arayarak tüm DataTypes'ları beklemek için bazı yöntemlere gereksinim duyuyoruz - .

Bu yöntemin ne zaman çalışması gerektiğine ve nasıl çalıştırılacağına emin değilim. Bir yandan, konfigürasyon özelliklerinin yarattığı fasülyelerin erişilebilir olmasına karşın, yaşam döngüsü yönetiminin başlatılmasından önce (entegrasyon akışlarım yönetilmeden önce) ve tercihen RabbitAdmin::afterPropertiesSet'dan önce çalışmam gerekiyor. benim RabbitMQ nesnelerim.

Bunu nasıl başarabilirim?

UPDATE: @ ArtemBilan'ın önerisini aşağıdan takip ettim ve burada eklediğim sahte bir örneği kodlayabildim.

bir ana sınıfı:

@EnableAutoConfiguration 
@Configuration 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplicationBuilder parentBuilder = new SpringApplicationBuilder(DemoApplication.class); 
     parentBuilder.child(ChildConfiguration.class).properties("name=bob", "message='hi how are you?'").run(); 
     parentBuilder.child(ChildConfiguration.class).properties("name=jane", "message='hi how are you?'").run(); 
    } 

    @Bean 
    public IntegrationFlow integrationFlow() { 
     Object object = new Object(); 
     return IntegrationFlows.from("inputChannel") 
       .handle(m -> System.out.println(object + " " + m.getPayload() + " " + System.currentTimeMillis())) 
       .get(); 
    } 
} 

bir çocuk yapılandırma:

@EnableAutoConfiguration 
@EnableConfigurationProperties(Sample.class) 
@Configuration 
public class ChildConfiguration { 

    @Bean 
    public IntegrationFlow anotherOutgoingFlow(Sample sample) { 
     return IntegrationFlows 
       .from(() -> new GenericMessage<>("hello " + sample.getName() + "; " + sample.getMessage()), 
         m -> m.poller(Pollers.fixedDelay(500))) 
       .channel("inputChannel") 
       .get(); 
    } 
} 

kapsamlı bir model sınıfı:

@ConfigurationProperties 
public class Sample { 
    private String name; 
    private String message; 

    public Sample() { } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

baskılar, örneğin:

2016-03-25 17:12:04.109 INFO 24637 --- [   main] com.example.DemoApplication    : Started DemoApplication in 0.169 seconds (JVM running for 3.878) 
[email protected] hello bob; 'hi how are you?' 1458940324438 
[email protected] hello jane; 'hi how are you?' 1458940324607 
[email protected] hello bob; 'hi how are you?' 1458940324938 
[email protected] hello jane; 'hi how are you?' 1458940325108 
[email protected] hello bob; 'hi how are you?' 1458940325439 

cevap

1

Şablon yapılandırmanızı sağlanan ortama göre yeniden kullanabileceğiniz zaman uygulamanız için parent/child mimarisini kullanmayı düşünün. Daha fazla bilgi için Spring Boot Reference Manual adresine bakın.

+0

Üzgünüz, biraz daha açıklayabilir misiniz?Eğer sizi anlarsam, üst düzey yapılandırmayı üst öğe olarak geçiren bir ana bilgisayarım olacak ve her 'DataType' için bir bağlam yaratıyor - bu da mantıklı - ama ben nesneler için nasıl referans alacağımı belirsiz değilim o anda "ConfigurationProperties" tarafından tanımlandı - zaten bir uygulama içeriği olduğunda tanımlanan nesneler değil mi? – jwilner

+0

M-m-m. Hayır, eğer çocuğunuzun uygulama içeriği kaynaklarında uygun yerde '@EnableConfigurationProperties (DataType.class)' seçeneğini kullanırsanız. –

+0

Belki de yanlış anlayabiliyorum, ancak ortamdaki fasulye tanımlarını değiştirmeyi bir araç olarak önermek gibi görünüyor - bir takım DataTypes'i bir başkası için değiştiriyorsunuz - ama benim sorunum tek bir ortamda çoklu yakınsama entegrasyon akışlarının nasıl tanımlanacağıdır çalışma zamanında yapılandırmaya dayalı. – jwilner