2009-10-06 23 views
1

我有一個過濾器的OSGi服務跟蹤器。我注意到有一個它錯過的服務('addingService'沒有被調用)。當我在我的osgi(equinox)shell中使用services命令時,使用跟蹤器使用的過濾器,返回錯過的服務。ServiceTracker有時會錯過服務?

回答

2

事實證明,在春分,環比ServiceTracker的#addingService經過與參考服務檢查BundleContextImpl#isAssignableTo。這將檢查引用的類是否連線到監聽包中的相同源(jar)。

在我的情況下,試圖獲得服務實現從引用類的來源導致null。原因是該服務實際上是由第三個包中的類創建的(該類稱爲註冊包中的方法,並使用返回值來創建服務)。

增加進口的包裝問題解決了這個問題

+0

註冊另一個bundle創建並沒有真正似乎是合理的事情不要做,對象作爲服務,不是嗎?我的意思是,這將嚴重干擾OSGi對捆綁服務的主動服務等概念。恕我直言,你應該在嘗試註冊「錯誤」對象時收到異常。 –

1

Neil BARTLETTOSGi in practice book (preview)包含一個關於Tracking Services(4.8章節)的有趣章節。

您是否在插件激活器中正確設置了此跟蹤器?
這裏是一本書的例子:

package org.osgi.book.reader.dbmailbox; 

import javax.sql.DataSource; 
import org.osgi.book.reader.api.Mailbox; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 
import org.osgi.framework.ServiceRegistration; 
import org.osgi.util.tracker.ServiceTracker; 
import org.osgi.util.tracker.ServiceTrackerCustomizer; 

public class DbMailboxActivator implements BundleActivator{ 

private BundleContext context; 
private ServiceTracker tracker; 

public void start(BundleContext context) throws Exception{ 
    this.context=context; 
    tracker=new ServiceTracker(context,DataSource.class.getName(),new DSCustomizer()); 
    tracker.open(); 
} 

public void stop(BundleContext context) throws Exception{ 
    tracker.close(); 
} 

private class DSCustomizer implements ServiceTrackerCustomizer{ 
    public Object addingService(ServiceReference ref){ 
    DataSource ds = (DataSource)context.getService(ref); 
    DbMailbox mbox=new DbMailbox(ds); 

    ServiceRegistration registration = context.registerService(Mailbox.class.getName(),mbox,null); 
     return registration; 
    } 

    public void modifiedService(ServiceReference ref, Object service){ 
    } 

    public void removedService(ServiceReference ref,Object service){ 
     ServiceRegistration registration = (ServiceRegistration)service; 
     registration.unregister(); 
     context.ungetService(ref); 
    } 
    } 
}