2017-05-26 5 views
1

多くのサービスがオプションであるDSコンポーネントを起動したい場合、サービスが起動していない場合、したがって、これらのオプションのサービスのカーディナリティをオプションとして設定します。したがって、これらのオプションのサービスが利用できない場合は、ターゲットコンポーネントもアクティブにすることができます。OSGi-DS:DSコンポーネントの必須サービスへの参照(実際には動的に更新可能ではありません)

しかし、私は有効にこれらのオプションサービスのいずれかの設定を変更し、そのサービスが利用可能になるが、それはここでは、そのターゲット・コンポーネントに

@Component(immediate = true, configurationPolicy = ConfigurationPolicy.IGNORE,name="directory.comp") 
public class DirectoryControllers 
{ 
    @Reference(policy=ReferencePolicy.DYNAMIC) 
     private volatile IZimbra zimbra; 
     @Reference(policy=ReferencePolicy.DYNAMIC,cardinality=ReferenceCardinality.OPTIONAL) 
     private volatile IOpenDJ opendj; 
     @Reference(policy=ReferencePolicy.DYNAMIC,cardinality=ReferenceCardinality.OPTIONAL) 
     private volatile IOpenIDM openidm; 

     private ServletRegistration _registration; 

     @Activate void activate(BundleContext bc) throws ServletException, NamespaceException 
     { 
      AppProvisioners provisioners=new AppProvisioners(zimbra,openidm,opendj); 
      _registration = ServletRegistration.register(
       bc, _httpService, "/middleware", 
       new ProvisioningController(_db,provisioners), 
       new UserEnrollmentController(_db,provisioners) 
      ); 
     } 
} 

が反映されません場合は、今の問題は、Zimbraのコンポーネントはそれほどオプションではありません私は設定を変更するたびにDirectoryControllersコンポーネントの影響を受けますが、openidm、opendjコンポーネントには当てはまりません。もちろん、オプションですが、有効な設定を変更するとDirectoryControllersコンポーネントの影響を受けません。

私も試しましたバインド/アンバインド:

private volatile IOpenIDM openidm; 

@Reference(name = "openidm.service", service = IOpenIDM.class, cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC, unbind = "unbindOpenIDMService") 
public void bindOpenIDMService(IOpenIDM openidm) { 
     this.openidm = openidm; 
} 

public void unbindOpenIDMService(IOpenIDM openidm) { 
     this.openidm = null; 
} 

この問題の原因となるものがありませんか?

ありがとうございます。

答えて

1

ReferencePolicyOption.GREEDYへの参照のためにpolicyOptionを設定する必要があると思います。 policyOptionのデフォルト値はReferencePolicyOption.RELUCTANTで、オプションのサービスが利用可能になったときにコンポーネントを再アクティブ化しません。

+0

いいえ、それは役に立ちません:\t @Reference(Policy = ReferencePolicy.DYNAMIC、cardinality = ReferenceCardinality .OPTIONAL、policyOption = ReferencePolicyOption.GREEDY) \tプライベート揮発性IOpenIDM openIDM; –

+0

ありがとうBJ、静的な参照を作成すると動作します:@Reference(policy = ReferencePolicy.STATIC ...) –

1

問題は、これらのコンポーネントはオプションであるため、アクティベーション時に存在する可能性があります。省略可能な参照が変更された場合、再アクティブ化されません。

コンポーネントのバインド/アンバインドメソッドで登録コードを実装しようとしていますが、この場合は変更に気付くことができる唯一の場所です。

+0

私はそれを使用していましたが、それを使用して削除しましたが、それも動作していません。 –

+0

これらのメソッドが全く呼び出されないことを意味しますか?それは変です。 –

+0

このメソッドは、DirectoryControllerがアクティブになったときに呼び出されます。次に、openidmの設定を変更した場合、DirectoryControllerの再アクティブ化も行われません。 –

関連する問題