0

私はいくつかのアプリ、いくつかのjarライブラリを呼び出すもの、Felixフレームワークを呼び出すもの、およびバンドルディレクトリからいくつかのバンドルを追加したものを持っています。

プロジェクトスキーム

「ヘルプを表示」ボタンのコード:

private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                           

        for (Bundle qqq : context.getBundles()) {
            if ("ihtika2.I_AboutForm".equals(qqq.getSymbolicName())) {
                System.out.println("I_AboutForm state: "+qqq.getState());
            }
        }

        try {
            ServiceReference[] refs = context.getServiceReferences(
                    AboutFormInterface.class.getName(), "(Funct=*)");
            if (refs == null) {
                System.out.println("Not Found AboutForm on show");
            } else {
                AboutFormInterface AboutForm = (AboutFormInterface) context.getService(refs[0]);
                AboutForm.showWindow(context);
            }
        } catch (Exception ex) {
            Ini.logger.fatal("Error on showing AboutForm", ex);
        }

    }  

In first click (before update) service founded correctly.

The code of the "Update" button:

  try {
            ServiceReference[] refs = context.getServiceReferences(
                    UpdaterInt.class.getName(), "(Funct=*)");
            if (refs == null) {
                System.out.println("Not Found UpdaterInt on demand");
            } else {
                UpdaterInt UpdaterLocal = (UpdaterInt) context.getService(refs[0]);
                UpdaterLocal.update();
            }
        } catch (Exception ex) {
            Ini.logger.fatal("Error on showing AboutForm", ex);
        }

アップデーターのバンドルのコード:

public void update() {

        System.out.println("Stage 1");

        int x = 0;


        Map<String, Bundle> bundlesList = new HashMap<String, Bundle>();

        for (Bundle singleBundle : context.getBundles()) {
            bundlesList.put(singleBundle.getLocation(), singleBundle);
            System.out.println(singleBundle.getLocation());
        }

        System.out.println("+++++++++++++++++++++++++++++");

        Map<String, Bundle> treeMap = new TreeMap<String, Bundle>(bundlesList);
        for (String str : treeMap.keySet()) {
            Bundle singleBundle = treeMap.get(str);
            System.out.println(str + " " + singleBundle.getSymbolicName());
            if (!"khartn.Updater".equals(singleBundle.getSymbolicName())
                    && !"org.apache.felix.framework".equals(singleBundle.getSymbolicName())) {
                try {
                    System.out.println("state0 " + singleBundle.getState());
                    singleBundle.stop();
                    System.out.println("state1 " + singleBundle.getState());
                    singleBundle.update();
                    System.out.println("state1.1 " + singleBundle.getState());
                    singleBundle.start();

                    synchronized (this) {
                        try {
                            this.wait(250);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                    System.out.println("state2 " + singleBundle.getState());
                } catch (BundleException ex) {
                    ex.printStackTrace();
                }
                System.out.println("***");
            }
        }


    }

更新時に、メインの JFrame が正しく更新されます - 非表示および表示されます。しかし、「ヘルプを表示」を 2 回クリックすると、Felix は「ヘルプを表示」のサービスを見つけることができません。「ヘルプを表示」サービス登録コード:

package ihtika2.i_aboutform;

import ihtika2.i_aboutform.service.AboutForm;
import ihtika2.i_aboutform.service.AboutFormInterface;
import java.util.Hashtable;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

public class Activator implements BundleActivator {

    @Override
    public void start(BundleContext context) throws Exception {
        Hashtable<String, String> props = new Hashtable<String, String>();
        props.put("Funct", "AboutForm");
        System.out.println("Registering I_AboutForm");
         context.registerService(AboutFormInterface.class.getName(), new AboutForm(), props);

    }

    @Override
    public void stop(BundleContext context) throws Exception {
    }
}

更新時に「Registering I_AboutForm」という文字列が表示されました。

Felix が再登録されたサービスを見つけられないのはなぜですか?

4

2 に答える 2

1

解決策は、アップデーターのバンドル コード呼び出しに追加することです。

context.getBundle(0).adapt(FrameworkWiring.class).refreshBundles(bundles, null);

これはOSGi API ドキュメントで説明されているように:

このバンドルが、別のバンドルによってインポートされたパッケージをエクスポートした場合、 FrameworkWiring.refreshBundlesメソッドが呼び出されるか、フレームワークが再起動されるまで、これらのパッケージはエクスポートされたままにする必要があります。

于 2012-09-21T08:59:34.973 に答える
0

サービスが見つからない理由は、インターフェイスAboutFormInterfaceが更新されたバンドルの以前のリビジョンにまだ配線されているためです。

解決策の 1 つは、更新中に安定するように、3 番目のバンドルでインターフェイスを定義することです。

于 2015-12-31T02:24:26.660 に答える