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 birNetworkDiagnostic
DataType
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
Ü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
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. –
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