ブループリント サービスは初めてなので、リファレンス リスナー コンテキストでサービスが起動するのを待つという要件を満たすサンプルを探しました。
いくつかのカーネル サービス (db、ネットワークなど) を提供するコア バンドルがあり、次のようなインターフェイス (blueprint.xml) でラップします。
<bean id="ServiceImplBean" class="com.mysite.service.impl.ServiceImpl" factory-Method="getInstance"/>
<service id="MyServiceInterface" ref="ServiceImplBean" interface="com.mysite.service.IService"></service>
別のバンドルでは、参照リスナーを使用してサービスが稼働中であることをリッスンしています。次のような設計図です。
<bean id="ServiceHolderBean" class="com.mysite.consumer.ServiceHolder" factory-method="getInstance" />
<reference id="ServiceHolderBeanReference" interface="com.mysite.service.IService">
<reference-listener ref="ServiceHolderBean" bind-method="bind" unbind-method="unbind" />
</reference>
IService をそのフィールドに取り込み、さらに使用するために保持する ServiceHolder ピースのクラスを次に示します。
public class ServiceHolder {
private static ServiceHolder instance = new ServiceHolder();
private IService service;
private ServiceHolder() {
}
public static ServiceHolder getInstance() {
return instance;
}
public void bind(IService service) {
this.service = service;
}
public void unbind(IService service) {
this.service = null;
}
public IService getService() {
return this.service;
}
}
その意図は、コンシューマ バンドルで、ServiceHolder.getInstance().getService()
そのサービスを簡単に利用できるようにすることです。
問題は、バンドル開始の初期段階またはサービスが登録される直前にサービスが必要になる場合があることです。明らかに、getService() を呼び出すと null が返されます。
バンドルの開始時にサービスのニーズを満たすためにブループリントを使用するベスト プラクティスは何ですか? のようなものを使用できると思いますwhile (service == null) { Thread.sleep(5000)'};
が、かなり悪いようです。より良い提案はありますか?