モジュール java.naming
パッケージ javax.naming.event

インタフェースEventContext

すべてのスーパー・インタフェース:
Context
既知のすべてのサブインタフェース:
EventDirContext

public interface EventContext extends Context
コンテキストに指定されたオブジェクトが変更されたときにトリガーされるイベントの通知を受け取る、リスナーの登録/登録解除に関するメソッドを含みます。

ターゲット

addNamingListener()メソッドの名前パラメータは、targetと呼ばれます。 ターゲットはスコープとともに、リスナーが対象とするオブジェクトを特定します。 まだ存在しないターゲットに対して配信登録を行うことはできますが、サービス・プロバイダや使用するプロトコル/サービスによってはサポート内容に制限がある場合があります。

サービスが既存のターゲットの登録のみをサポートしている場合、存在しないターゲットへの登録を試みると、NameNotFoundExceptionができるだけ早くスローされます(できれば、addNamingListener()がコールされたとき)、または可能でない場合は、リスナーはNamingExceptionEventを介して例外を受け取ります。

また、既存のターゲットの登録のみをサポートするサービス・プロバイダの場合、リスナーが登録したターゲットが後でネームスペースから削除されると、リスナーはNamingExceptionEvent (NameNotFoundExceptionを含む)を介して通知されます。

アプリケーションは、targetMustExist()メソッドを使用して、存在しないターゲットの登録がEventContextでサポートされているかどうかを確認できます。

イベント・ソース

登録メソッドを起動するEventContextインスタンスは、(潜在的)が生成されるイベントの「イベント・ソース」です。 イベント・ソースはターゲットで指定したオブジェクトである必要はありません ターゲットの名前が空である場合のみ、ターゲットで指定したオブジェクトがソースになります。 つまり、ターゲットとスコープ・パラメータは、リスナーが関心を持っているtheobject(s)を識別するために使用されますが、イベント・ソースはリスナーが登録されているEventContextインスタンスです。

たとえば、リスナーが次の登録を行なったとします。

      NamespaceChangeListener listener = ...;
      src.addNamingListener("x", SUBTREE_SCOPE, listener);
"x/y"という名前のオブジェクトがその後削除されると、対応するNamingEvent (evt)に次のものが含まれている必要があります:
      evt.getEventContext() == src
      evt.getOldBinding().getName().equals("x/y")

さらに、リスナーの登録/登録解除は、ネームスペース内の対応するオブジェクトではなく、EventContext instanceを使用して行われます。 プログラムがなんらかの時点でリスナーを削除する場合は、addNamingListener() (リスナーへの参照を後で削除するために保持する必要がある場合と同じです)を起動したEventContextインスタンスへの参照を保持する必要があります。 lookup()を実行し、登録解除を実行するEventContextの別のインスタンスを取得することは期待できません。

登録の有効期間

登録したリスナーが登録解除されるのは次の場合です。
  • removeNamingListener()を使用して削除されます。
  • イベント情報の収集時に例外がスローされた。 つまり、リスナーがNamingExceptionEventを受信した場合です。
  • Context.close()は、それが登録されているEventContextインスタンスで起動されます。
その時点まで、未処理のリスナーを持つEventContextインスタンスは、引き続き存在し、サービス・プロバイダによって維持されます。

リスナーの実装

登録/登録解除メソッドは、NamingListenerのインスタンスを受け入れます。 NamingEventのイベント・タイプごとに、NamingListenerのサブインタフェースがあります。 たとえば、ObjectChangeListenerインタフェースは、NamingEvent.OBJECT_CHANGEDイベント・タイプ用です。 複数のイベント・タイプに関係を登録するには、リスナー実装で複数のNamingListenerサブインタフェースを実装し、単一のaddNamingListener()起動を使用する必要があります。 これにより、メソッド呼出しの回数の減少、およびリスナーのコード・サイズの削減に加えて、一部のサービス・プロバイダでは登録を最適化することができます。

スレッド問題

一般的に、Contextインスタンスと同様に、EventContextのインスタンスはスレッド・セーフである保証はありません。 複数のスレッドが同じEventContextに同時にアクセスする場合は注意が必要です。 スレッドの問題の詳細は、「パッケージの説明」を参照してください。
導入されたバージョン:
1.3
  • フィールド詳細

    • OBJECT_SCOPE

      static final int OBJECT_SCOPE
      ターゲットに指定されたオブジェクトに関するイベントを通知するかどうかを指定する定数です。

      この定数の値は0です。

      関連項目:
    • ONELEVEL_SCOPE

      static final int ONELEVEL_SCOPE
      ターゲットに指定されたコンテキストのオブジェクトに関するイベントを通知するかどうかを指定する定数です。ターゲットに指定されたコンテキストは除きます。

      この定数の値は1です。

      関連項目:
    • SUBTREE_SCOPE

      static final int SUBTREE_SCOPE
      ターゲットに指定されたコンテキストのサブツリーにあるオブジェクトに関するイベントを、通知するかどうかを指定する定数です。ターゲットに指定されたオブジェクトも含みます。

      この定数の値は2です。

      関連項目:
  • メソッドの詳細

    • addNamingListener

      void addNamingListener(Name target, int scope, NamingListener l) throws NamingException
      リスナーを追加して、ターゲットおよびスコープで特定オブジェクトの変更時にトリガーされた、名前付きイベントを受け取れるようにします。 これらイベントのイベント・ソースがこのコンテキストになります。 イベント・ソースおよびターゲットについてはクラスの説明を参照してください。 定数OBJECT_SCOPEONELEVEL_SCOPEおよびSUBTREE_SCOPEの説明を参照して、scopeが登録に与える影響を確認してください。

      targetは、scopeONELEVEL_SCOPEの場合にのみコンテキストに名前を付ける必要があります。scopeOBJECT_SCOPEまたはSUBTREE_SCOPEの場合、targetは非コンテキストに名前を付けることができます。 非コンテキストにSUBTREE_SCOPEを使用すると、たとえば、targetがコンテキストかどうかがあらかじめわかっておらず、targetをルートとする(サブツリーの退化の可能性)への関心を登録する場合などに便利です。

      リスナーにイベントが通知されると、リスナーは、addNamingListener()が実行されるスレッド以外のスレッドで起動される場合があります。 複数のスレッドが同じEventContextに同時にアクセスする場合は注意が必要です。 スレッドの問題の詳細は、「パッケージの説明」を参照してください。

      パラメータ:
      target - このコンテキストに関連して解釈されるnull以外の名前。
      scope - OBJECT_SCOPEONELEVEL_SCOPEまたはSUBTREE_SCOPEのいずれか。
      l - null以外のリスナー。
      例外:
      NamingException - リスナーの追加中に問題が検出された場合。
      関連項目:
    • addNamingListener

      void addNamingListener(String target, int scope, NamingListener l) throws NamingException
      リスナーを追加して、文字列のターゲット名およびスコープで特定したオブジェクトの変更時に、トリガーされた名前付きイベントを受け取れるようにします。 詳細は、Nameを受け入れるオーバーロードを参照してください。
      パラメータ:
      target - このコンテキストを基準にして解決されたオブジェクトのnull以外の文字列名。
      scope - OBJECT_SCOPEONELEVEL_SCOPEまたはSUBTREE_SCOPEのいずれか。
      l - null以外のリスナー。
      例外:
      NamingException - リスナーの追加中に問題が検出された場合。
      関連項目:
    • removeNamingListener

      void removeNamingListener(NamingListener l) throws NamingException
      このEventContextによって起動されたネーミング・イベントの受信からリスナーを削除します。 リスナーがこのEventContextに複数回登録されている可能性があります。ターゲット/スコープの引数は異なる可能性があります。 このメソッドが呼び出されると、リスナーはこのEventContextインスタンスをイベント・ソース(ディスパッチ処理中のイベント以外)として持つイベントを受信しなくなります。 リスナーがこのEventContextインスタンスに登録されていなかったか、登録されていない場合、このメソッドは何も行いません。
      パラメータ:
      l - null以外のリスナー。
      例外:
      NamingException - リスナーの削除中に問題が見つかった場合。
      関連項目:
    • targetMustExist

      boolean targetMustExist() throws NamingException
      存在しないターゲットで、リスナーが配信処理を登録できるかどうか判定します。
      戻り値:
      ターゲットが存在する必要がある場合はtrue。ターゲットが存在する必要がない場合はfalse。
      例外:
      NamingException - このコンテキスト動作が判定できない場合。