2010-02-05 13 views
5

Hizmet etkinlikleri için hangi garantilerin verildiğini anlamaya çalışıyorum.ServiceListener ve ServiceTracker çağrılarında hangi sipariş garantisi verilir?

OSGi özellikleri, ServiceEvents öğelerinin senkron olduğunu, bunun ServiceComist ServiceCriter hizmeti tamamlanıncaya kadar serviceChanged() çağrısına kadar bir ServiceListener hizmetinin bir serviceChanged() çağrısı aldığını ima etmek için aldığımı bildirir. Bu doğru mu?

Ayrıca ServiceTracker kaynağına da baktım. Bu iki serviceChanged() çağrısının çakıştığı durumla başa çıkmaya çalışıyor gibi görünüyor. Mümkün mü?

ServiceTrackerCustomizer'a yapılan çağrılarda benzer garantiler var mı?

cevap

1

Bu çok zor bir sorundur. Bir hizmet OSGi'ye kaydedildiğinde, olay ele alınır ve tüm ilginç taraflara bildirilir (hizmet dinleyicileri, hizmet izleyicileri ve bildirim hizmeti çalıştırma zamanı). Her ilgili tarafın etkinliği ele alma şansı vardır. Etkinliğin ele alınması, ek hizmetlerin kaydedilmesini veya kaydını tutmayı içerebilir. ServiceEvent bildiriminin senkronize davranışından dolayı, bu olaylar ilgili taraflara gönderilir. Uzun bir bağımlılık zincirinde, tek bir hizmeti kaydetmeye gittiğiniz bir bildirim ağacıyla sonuçlanırsınız ve bir grup yeni kişinin kayıtlı olmasına neden olur. Bunu biliyorum çünkü performans kayıtlarını OSGi'nin çok zorlu bir şekilde yapmasını sağlayabilirsiniz, çünkü basit kayıt servis çağrılarınız, bilinmeyen bir servis sayısının servis aktivasyonu için ücretlendirildi.

Sorunuza özel olarak yanıt vermek için, olaylarla çok iş parçacıklı bir sorun değil, yeniden giriş yapan bir tanesi. Bu, kayıt etkinliğinizi işleyen adam, tam ağaç işlenmeden önce başka bir etkinlik bildirimi ile size geri dönebilir. Bu, kilitleri tutarken hizmetleri hiçbir zaman kaydetmemeyi veya silmemenizi veya etkinlik dağıtıcı iş parçacığının kilitlenmesine neden olmanızı şiddetle tavsiye etmelerinin nedenlerinden biridir. Güvende kalmanın bir başka iyi yolu da bir demet bağımlılık ağacına sahip olmak, bir grafik değil. Gruplar derlenmiş olsa bile, demetler arasındaki dairesel bağımlılıklar gerçek sorunlara neden olabilir.

Umarım bu yardımcı olur. Bu tür bir şey hakkında daha fazla okumak istiyorsanız, OSGi ve Equinox’ta yeni bir kitap çıkıyor. Şimdi kaba kesim mevcut ve çok yakında baskıda mevcut olmalıdır. http://my.safaribooksonline.com/9780321561510

+0

Başlangıç ​​sırasında bu olay fırtınalarını önlemek ve bir miktar sipariş vermek için startlevel'leri kullanabilirsiniz. – akr

+1

Hizmet A kaydedilmişse, her ilgili ServiceListener bu hizmet için REGISTERED olayına sahip bir serviceChanged() çağrısı alır. REGISTERED olayı işlenirken aynı hizmet A * için bir UNREGISTERING olayı ile yeniden girişe yönelik bir serviceChanged() çağrısı almak mümkün mü? Hizmetin kaydını silmek için Hizmet Kaydına ihtiyacınız olduğu ve kayıt tamamlanana kadar kullanılamayacağının mümkün olduğunu göremiyorum, ancak ... –

İlgili konular