2009-10-14 19 views
9

Açık (bildirim) bir hizmetle birlikte bir OSGi paketi oluşturdum. Eğer aktive edildiğinde, bir şeylerin hizmetin sağlanamayacağı şekilde yanlış olduğunu fark ettiğimde, maruz kalmasını engellemem gerekiyor. Şu anda aktivasyon fonksiyonu şöyle görünür:Servis başlangıcında bir OSGi hizmetini devre dışı bırakmanın doğru yolu nedir?

public void activate(ComponentContext context, Map<String, Object> properties) { 
    try { 
     ... 
    } 
    catch(Exception e) { 
     throw new ComponentException("Some reason"); 
    } 
} 

bulamıyorum:

public void activate(ComponentContext context, Map<String, Object> properties) { 
    pid = (String) properties.get(Constants.SERVICE_PID); 
    try { 
     ... 
    } 
    catch(Exception e) { 
     context.disableComponent(pid); 
    } 
} 

diğer alternatif sadece bu gibi istisna yaymak (veya yenisini atmak, bağlı olarak)/sarılmasıdır OSGi Service Platform Service Compendium bildiren hizmetler bölümünde belirtilen doğru davranış, ancak bir şey eksik olabilir

cevap

8

Hmm, benim için bir hata oluştuğunda bir Özel durumun atılması gerektiğini mantıklı görünüyor. Temel olarak, yaptığınız şey, başlangıç ​​yönteminde bir BundleActivator'ın davranışını taklit etmektir. Başlangıç ​​yöntemi, bir Özel Durum olmadan geri döndüğünde paket AKTİF durumuna girer (aksi halde RESOLVED içinde kalır). DS belirtiminde biraz uyumlu bir paragraf buldum (ilginç kısmı vurguladım):

Devre dışı bırakılabilmesi için bir bileşen örneğinin etkinleştirme işlemini tamamlaması gerekir. Bileşen yapılandırması devre dışı bırakıldığında veya , istisnası nedeniyle etkinleştirilemediğinde, SCR'nin tüm bileşenin bağlı hizmetlerini kaldırması ve etkinleştirme ile ilişkili bileşen örneğindeki tüm başvuruları atması gerekir. OSGi 4.2 cmpn spec

yılında

Bölüm 112.5.6 P.320 bu berrak olmadığını kabul edersiniz, bu yüzden güvenli tarafta (üzgün daha iyi güvenli) üzerinde olmasını istiyorsanız, ben tavsiye ederim kombinasyonu yapın (spec tarafından izin verilir).

public void activate(ComponentContext context, Map<String, Object> properties) { 
    try { 
     ... 
    } catch(Exception e) { 
     context.disableComponent((String) properties.get(Constants.SERVICE_PID)); 
     // not sure if a CE is best here... Maybe just rethrow the original one 
     throw new ComponentException("Some reason"); 
    } 
} 

alkış Mirko

0

kendini devre dışı bir bileşen, uygun bir OSGI tasarımı olması pek olası değildir. Durum geliştiğinde bileşeni ne sağlayacak? Etkin/devre dışı durumun etkinleştirilen/devre dışı bırakılandan farklı bir mantıksal seviye olması amaçlanmıştır. Düzgün tasarlanan OSGI kodu, etkinleştirme başarısız olduğunda bir ComponentException (veya başka bir istisna) atanan kodla düzgün bir şekilde işlenmelidir.Bileşenin bir hizmeti kaydettirdiğini varsayarsak, hizmet referansı kullanılabilir olur, ancak hizmetin sunulmaya çalışılması sıfırlanır. DS, hizmet referansları ile doğru bir şekilde ilgilenecektir ve hizmeti doğrudan hizmet referansından alma girişiminde bulunan herhangi bir kod, hizmetin gerçekte kullanılabilir olmadığı olasılığıyla düzgün bir şekilde ilgilenmelidir. Ancak, bu kafa karıştırıcı olabilir. Felix DS'de, spesifikasyonları kabul edilmemesine rağmen, bileşenlerin kendi hizmet özelliklerini değiştirebilecekleri bir uzantı gerçekleştirdim. Bu uzantıyı kullanarak, bir bileşen etkinleştirme veya değiştirme başarılı olduğunda aktif = true gibi bir hizmet özelliği ekleyebilir ve değişiklik başarısız olduğunda veya devre dışı bırakıldığında onu kaldırabilir. Hizmetin istemcileri, bu hizmet özelliğini filtreleyebilir, ör. (Aktif = doğru).

İlgili konular