2016-09-08 5 views
1

私はIFooインターフェイスのDS-サービスのコンシューマーがありますのOSGiは:特定のサービスが利用可能になったときにDS-サービスの消費者は、同期通知を受けるですか

@Component 
public class IFooListener { 

    @Reference(bind = "bind", 
       unbind = "unbind", 
       referenceInterface = IFoo.class, 
       cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, 
       policy = ReferencePolicy.DYNAMIC) 
    public static final Map<String, IFoo> allServices = new ConcurrentHashMap<>(); 

    protected void bind(IFoo service, Map<String, String> properties) { 
    .... 
    } 
    .... 
} 

私はIFooサービスがそのように登録されている:

BundleContext ctx = FrameworkUtil.getBundle(IFooListener.class).getBundleContext(); 
Properties properties = new Properties(); 
.... 
ServiceRegistration managementSrv = ctx.registerService(IFoo.class.getName(), iFooImpl, properties); 

私が知りたいのは、ctx.registerService(...)メソッドが返ってくると、その時点で既に利用可能だったすべてのDSコンシューマに、IFooサービスが登録されたことが通知されることです? このosgi実装固有のことはありますか?または、DS仕様のこの部分ですか?

+0

いくつか存在するため、使用する注釈を指定する必要があります。これらは、標準のOSGiアノテーションではありません。答えとして、そのような保証に頼るのは非常に悪い習慣です。 –

答えて

1

仕様で正確な答えが見つかりませんでした。しかし、私はFelix SCRのコードをチェックしただけで、新しいスレッドを開くことはできませんでした。これはServiceListenerインターフェースを実装しています(常に深いレベルになければならないため)。幸いにもServiceListenerのjavadocは、addingServiceが同期的に呼び出されると言います。

要約:バインド方法は、Felix SCRで同期的に呼び出されます。

+0

これで、SCRはServiceListenerを実装し、OSGi仕様に従って「ServiceEventが起動されると、ServiceListenerに同期的に配信されます。」だから、ある意味で、ctx.registerService()が返ってくると、SCRに通知されていたと確信しています。しかし、それはSCRがすべての管理コンポーネントに通知したことを意味しますか?私は仕様でこれを見つけられなかったので、実装固有のものだと思います。あなたは正しい、それは少なくとも今のところフェリックスにとって真実だ。しかし、将来、Felixの開発者は非同期の問題でコンポーネントに通知することにしますか? – mdzh

+0

はい。それは私が意味していたものです。今、Felix SCRは新しいスレッドを開始しません。もし私があなただったら、私はServiceTrackerを使います。基本的にServiceTrackerなので、DSの複数の動的参照を使用する必要性を感じたことはありません。それが[ECM] [1]がそのような参照型を持たない理由です。 [1]:http://www.everit.org/ecm/index.html –

+1

言い換えれば:いいえ、それは保証されていません。 –

関連する問題