2016-04-07 21 views
1

Deve rotalarımı düzenleyen bir RouteBuilder alt sınıfım var. İlkbahar tarafından inşa edilmiştir. Ben yapmak istiyorum neDeve: Yapılandırmadan koşullu bir yol nasıl oluşturulur?

@Override 
public void configure() throws Exception { 
    from(...) 
    .process(...) 
    .to(...) 
} 

yapılandırmasına göre ek bir son nokta yönlendirme ekleyin: Başlangıçta şöyle bir şey görünüyordu. Spring'in RouteBuilder fasulyesini oluşturmak için kullandığı bir Özellikler dosyası ve ayarladığı alanlardan biri boolean addAnotherEndpoint'dur. Bu boole doğruysa, başka bir to eklemek istiyorum. Eğer yanlışsa, şimdiki davranışına geri dönmesini istiyorum. Ben çalışıyorum olsa

@Override 
public void configure() throws Exception { 
    from(...) 
    .process(...) 
    .to(...) 
    .choice() 
     when(constant(addAnotherEndpoint)).to(...) 
    .endChoice(); 
} 

Bana bunun özelliklerinden addAnotherEndpoint değerini çekiyor çünkü (bunun için birim testleri yazma sorunları yaşıyorum istenilen davranışı gibi gözükse de

bile dosya: Ben bu olarak değiştirdim testlerimde geçersiz kılmak için). Bunu işlemenin daha iyi bir yolu var mı? Mevcut yöntemimin istenmeyen yan etkileri olacak mı?

DÜZENLEME: Ben CamelSpringTestSupport alt sınıfı kullanarak test ediyorum

(JUnit testleri kullanarak). @Before yönteminde, tüm uç noktaları alaylarla değiştiren bir AdviceWithRouteBuilder oluşturur.

@Test 
public void testConditionalRouting() throws Exception { 
    context.start(); 
    MyRouteBuilder routeBuilder = (MyRouteBuilder) applicationContext.getBean("myRouteBuilder"); 
    routeBuilder.setAddAnotherEndpoint(true); 
    getMockEndpoint("myMockEndpoint").expectedMessageCount(1); 
    sendMockMessage(); 
    assertMockEndpointsSatisfied(); 
    context.stop(); 
} 

false için addAnotherEndpoint ayarlar ve 0 mesajların alındığı iddia karşılık gelen test yoktur: Benim @Test, ben Özellikleri dosyasından alınır addAnotherEndpoint değerini geçersiz kılmak için çalışıyorum. Sorun şu ki, bu değişkenin değerini geçersiz kılmak işe yaramaz. Bir sınama geçer ve diğeri, Properties dosyamın true veya false olması gerekip gerekmediğine bağlı olarak başarısız olur. Bunun bana önerdiği şey, ayarın geçersiz kılınmasından (ve dolayısıyla bağlam başlamadan önce) rota oluşturulmasından kaynaklanıyor. Bir hata ayıklayıcısını kontrol ettim ve ayarı doğru şekilde geçersiz kılınmış. Sadece herhangi bir etkisi yok gibi görünüyor.

DÜZENLEME 2: benim AdviceWithRouteBuilder itibaren

:

@Override 
public void configure() throws Exception { 
    replaceFromWith(MOCK_FROM_ENDPOINT); 
    interceptSendToEndpoint(FIRST_TO_ENDPOINT) 
      .skipSendToOriginalEndpoint().to(MOCK_FIRST_TO_ENDPOINT); 
    weaveById(MY_PROCESSOR_ENDPOINT).replace() 
      .to(MOCK_MY_PROCESSOR_ENDPOINT); 
    weaveById(SECOND_TO_ENDPOINT).replace() 
      .to(MOCK_SECOND_TO_ENDPOINT); 
} 

Bu sahte son nokta ile her VAP değiştirir. Bunlara dayanan 4 testim var ve beklendiği gibi çalışıyorlar, tek sorun koşullu yönlendirme.

JUnit açıklamalarından yapılan Kenara

, benim test sınıfında sadece ek açıklamaları yeni İlkbahar Uygulama Bağlam döndüren isUseAdviceWith() üzerine @Override (true döndürür) ve createApplicationContext() vardır.

Testlerimi context.start() olmadan yürüttüm ve iletilen tek mesaj, 0 iletisinin alındığını gösteren yoldur (rota başlatılmamışsa anlam ifade eder). Bu yüzden bağlamın otomatik olarak başlatıldığına inanmıyorum.

Testim iyiydi ama benim rota oluşturma nasıl yeniden düşünmek zorunda kaldı:

+0

Bu bana çok normal bir yol gibi görünüyor. Tek sorun, test ettiğin gibi olurdu. Canlı bir ortamda, bu rota tamam olmalı. Nasıl test ettiğinizi paylaşabilir misiniz? O zaman bunu da düzeltebiliriz. BTW, yalnızca bir koşulu olan bir Seçim yerine bir Filtre kullanırsanız daha basit olur. –

+0

Öneriniz için teşekkürler. Bunu test etmek için 'CamelSpringTestSupport' alt sınıfını kullanıyorum. Bunu dahil etmek için soruyu güncelleyeceğim. – tytk

+0

Ayrıca AdviceWithRouteBuilder bloğunu da görebilir miyim? Ayrıca, test sınıfınızda herhangi bir ek açıklama var mı? Context.start() öğesini de kaldırabilir misiniz? Testlerinizin başlangıcından itibaren, bağlamın otomatik olarak başlatılıp başlatılmadığını görmek için onları çalıştırın. Eğer öyleyse, sorun var ... –

cevap

1

Burada çalışma sona erdi budur. Bahar bağlamı oluşturulduğunda, rota inşa edildi.O zaman addAnotherEndpoint değerini kontrol etti ve buna bağlı olarak constant'u ayarlayın. Ancak boolean, ilkel bir değerdir; bu, değere göre geçirildiği anlamına gelir. Bu neden önemli? constant() işlevi, rotanın tarafından oluşturulduğu andaki rotayı değerine göre ayarladığından. Daha sonra Bahar üzerinden değiştirilmenin, değerin zaten okunması nedeniyle hiçbir etkisi olmadı. Yapmam gereken şey, bir nesneyi bir yüklem olarak geçirmekti, böylece aynı nesneyi bir fasulye olarak daha sonra manipüle edebildim.

Ayrıca, bir choice() dan önerildiği gibi bir filter() olarak değiştirdim. Bahar aracılığıyla manipüle edilebilir

@Override 
public void configure() throws Exception { 
    from(...) 
    .process(...) 
    .to(...) 
    .choice() 
     when(myBooleanPredicate).to(...) 
    .endChoice(); 
} 

Ve özel yüklem:

public class BooleanPredicate implements Predicate { 
    private boolean value; 

    @Override 
    public boolean matches(Exchange exchange) { 
    return value; 
    } 

    public void setValue(boolean value) { 
    this.value = value; 
    } 

Bu BooleanPredicate 'ın iç valueaddAnotherPredicate olarak ayarlanır İşte bitmiş ürün. BooleanPredicate referansı geçtiği için rota her çalıştırıldığında tekrar okunur.

İlgili konular