1

OSGi EventAdmin サービスのデモ アプリケーションを実行しようとしていますが、実装した EventHandler は、EventAdmin パブリッシャーによって投稿されたイベントをリッスンできません。

以下は Event Publisher のコードで、その後に Listener(EventHandler) のコードが続きます。

public class Publisher implements BundleActivator{

static EventAdmin eventAdmin;
ServiceReference ref;
static HashMap properties= null;

@Override
public void start(BundleContext context) throws Exception {
    ref=context.getServiceReference(EventAdmin.class.getName());

    if(ref==null){
        System.err.println("Unable to aquire EventAdmin Ser Ref.");
    }

    eventAdmin=(EventAdmin) context.getService(ref);
    if(eventAdmin==null){
        System.err.println("unable to get service:EventAdmin");
    }

    properties=new HashMap();
    properties.put("XYZ", "Test");
    Event event = new Event("lnu/test/event/Demo", properties);
    eventAdmin.postEvent(event);
    System.out.println("event posted");

}

@Override
public void stop(BundleContext context) throws Exception {
    // TODO Auto-generated method stub
}
}

リスナーのコード:

public class Listener implements BundleActivator, EventHandler {    

public void start(BundleContext context) {
Dictionary d = new Hashtable();

d.put(EventConstants.EVENT_TOPIC, "lnu/test/event/Demo" );

context.registerService( EventHandler.class.getName(),
this, d );
System.out.println("event handler is registered now");
}

public void stop( BundleContext context) {}

public void handleEvent(Event event ) {
System.err.println("Event has been captured");
System.out.println("getTopic: "+event.getTopic());
System.out.println("getproperty: "+event.getProperty("XYZ"));
}
}

コード内の print ステートメントは、イベントがパブリッシャーによって投稿され、リスナーが EventHandler サービスに登録されていることを示していますが、それでもリスナー側で handleEvent メソッドを呼び出しません。理由はわかりません。舞台裏で何が起こっているのか理解できません。実行時の例外/エラーはありません。

使用される IDE は Eclipse Juno Build id: 20120614-1722 with Equinox です。

次のターゲット プラットフォーム バンドルが実行構成に含まれています。

  1. org.eclipse.osgi
  2. org.eclipse.equinox.event
  3. org.eclipse.equinox.util
  4. org.eclipse.osgi.services

私が行方不明または間違っていることを教えてもらえますか? または、OSGi EventAdmin サービスの実例へのリンクがあれば教えてください。

4

2 に答える 2

1

パブリッシャー バンドルが既にイベントを投稿した後に、リスナー バンドルが登録されていると思います。

バンドルの開始順序を制御しない限り、バンドルの開始メソッドでこれをテストするとエラーが発生しやすくなります。この簡単なテストでは、パブリッシャーで別のスレッドを開始して、数秒ごとにイベントを投稿することをお勧めします。リスナーは、登録されるとそれらの取得を開始する必要があります。

于 2012-11-02T18:48:10.173 に答える
0

リスナー バンドルが EventAdmin バンドルと同じ org.osgi.service.event パッケージをインポートしていることを確認します。リスナー バンドルに org.osgi.service.event パッケージが含まれているため、EventAdmin バンドルと同じ org.osgi.service.event パッケージを使用していない可能性があります。これが、EventAdmin バンドルが EventHandler サービスを呼び出さない理由である可能性があります。それは別のことかもしれませんが、これは確認すべきことです。

于 2012-11-02T21:44:22.113 に答える