10

ではblueprint.xml、オプションの依存関係を次のように宣言します。

<reference id="RepositoryListener"
    interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener"
    availability="optional" />

<bean id="Repository"
    class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl">
    <jpa:context property="entityManager" unitname="ODP_Server" />
    <tx:transaction method="*" value="Required" />
    <property name="repositoryListener" ref="RepositoryListener" />
</bean>

RepositoryImpl、私は持っています

public void setRepositoryListener(RepositoryListener repositoryListener) {
    logger.info("Repository listener set");
    this.repositoryListener = repositoryListener;
}

RepositoryListenerこのメソッドは、予想どおり、利用可能なサービスがない場合でもブループリントによって呼び出されます。問題は、サービスがあるかどうかを後で確認するにはどうすればよいかということです。

    if (repositoryListener != null) {
        repositoryListener.notifyDelete(node);
    } else {
        logger.warn("No repository listener set!");
    }

repositoryListenerではなくnull、ブループリント プロキシであるため、動作しません。

4

1 に答える 1

16

3つのオプションがあります。

  • 通常、(欠落している)オプションのサービスを試して使用すると、ブループリントがバッキングサービスが表示されるのを待っている間、5分の遅延が発生し、その後に。が続きServiceUnavailableExceptionます。したがって、1つのオプションは、非常に短いブループリントタイムアウトを設定し、ServiceUnavailableExceptionをキャッチすることです。
  • 間違いなくよりクリーンなオプションは、参照リスナーを使用してサービスのライフサイクルを監視することです。これには、余分なコードが必要になるという欠点があります。
  • すべての中で最も単純な(したがって最も怠惰な)オプションは、オプションの参照の代わりにオプションの参照リストを使用することです。満足のいくサービスが存在しない場合、リストは空になります。もちろん、満足のいくサービスが複数存在する場合は、何をしたいのかを考える必要があります。

より短いタイムアウトを設定するには、オプションのサービス参照に属性を追加するだけです。

<reference
    id="someReference"
    interface="org.some.service.ServiceInterface"
    availability="optional"
    timeout="100" />

参照リスナーを使用するには、ブループリントxmlに次のようなものを追加します(Enterprise OSGi in Actionの第6章に、より詳細な例と説明があります)。

<reference
        id="someReference"
        interface="org.some.service.ServiceInterface">
        <reference-listener
            ref="someBean"
            bind-method="bind"
            unbind-method="unbind" />
    </reference>

bindおよびメソッドは、サービスが表示および非unbind表示になると(または、参照リストを使用している場合は、サービスが参照リストに追加および削除されると)呼び出されます。

参照リストを使用する場合、実際にはコード例は必要ありません。<reference-list要素を使用して、setterメソッドがリストを取得するようにしてください。

于 2012-05-29T08:41:31.667 に答える