0

私はしばらくの間、OSGiランタイムとしてApache Felixを使用してアプリケーションを開発してきましたが、これまでのところ、進歩は素晴らしいものでした。ただし、依存関係の注入を採用したいので、ApacheFelixの「デフォルト」メカニズムはiPOJOのようです。

ただし、Apache felixに関するドキュメントとチュートリアルは弱すぎて、どこにも到達できませんでした。ですから、私は変化する準備ができていますが、まず最初に、私がやろうとしている(非常に単純な)考えを説明したほうがよいでしょう。

2つのバンドルが与えられます。

消費者バンドル

package bundles.consumer;

class Consumer implements BundleActivator{
    @Inject
    private Producer producer;

    public void bundleActivated(BundleContext con) {
        this.producer.getNextItem();
    }
}

プロデューサーバンドル

package bundles.producer;

@Singleton
class Producer {
    public String getNextItem() {
        return "item x"; 
    }
}

OSGiランタイムでコンシューマーバンドルを起動し、プロデューサーが機能する必要があることを認識してから、フレームワークがプロデューサーバンドルを起動し、コンシューマーにインスタンスを挿入します。シンプル。iPOJOは、これはアノテーションのみ(@ Singleton、@ Inject)または同様のものを使用して可能であると示唆していますが、私はそれを機能させることができません。OSGiには明らかに宣言型サービスがありますが、それは私が本当に避けたい多くのXMLを書くことを意味します。

Anywoo、私は、JBoss、Equinox、または代替のOSGiランタイムと、代替の依存関係インジェクションメカニズムを適応させる準備ができています。それは、Peaberry、Spring DM、または完全に異なるものです。私はすでにMavenを使用しています。

私が求めているのは、誰かがプロデューサーとコンシューマーのアイデアを使用してHello Worldを作成し、私が始めるのを手伝ってくれるかどうかです。私は本当にたくさんの時間を読んで、学習曲線が乗り越えられないことに気づきました!


編集、SCRを使用した私の試み:http://tydus.net/codeExamples/mvnScr.tar

4

3 に答える 3

2

OSGi標準であるため、宣言型サービスを使用することをお勧めします。

Javaアノテーションを使用して、Maven SCRプラグインでDSの依存関係、サービス、およびコンポーネントを記述することができます

よろしく、Dmytro

于 2012-01-10T08:10:41.127 に答える
1

心に留めておくべき2つのことがあります。1)バンドルには、依存性注入フレームワーク用の追加のメタデータが必要になる可能性があります。2)DIフレームワークのランタイムをデプロイする必要があります。

依存性注入はコアOSGi(つまり、Felixフレームワーク)の一部ではないため、独自のバンドルをデプロイする前に、まずiPOJOバンドルをデプロイする必要があります。さらに、詳細については、IPOJO、グーグル「maven-ipojo-plugin」に必要なメタデータを追加する必要があります。

Felix自体よりも必要最低限​​のコンテナを探している場合は、Karafを試してください(エンタープライズエクストラがたくさん付属しています)。

個人的には、宣言型サービス(+1 Dmytro)が非常にシンプルで、OSGiからボイラープレートコードを削除するだけなので、気に入っています(これもデプロイし、バンドルにcomponent.xmlを提供することを忘れないでください。詳細については、maven -scr-pluginを参照してください) 。 。


編集

(以下のコメントとtarballへのリンクへの回答として)

@ServiceアノテーションをProducerからProducerImplに移動しました。

生成されたSCRcomponent.xmlは、unbind()メソッドを追加し、@ Referenceを変更することにより、コンシューマーに対して完全に正しくありませんでした。

//...
import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
import static org.apache.felix.scr.annotations.ReferencePolicy.DYNAMIC;

//...
@Component
public class Consumer
{
    @Reference(policy = DYNAMIC, cardinality = MANDATORY_UNARY)
    private Producer producer;

    public void unbindProducer() {
        System.out.println("Producer unbound.");
        this.producer = null;
    }
//...
}

Mavenのデプロイ

Mavenを使用している場合は、MavenにPax Urlをインストールします。これにより、ローカルおよびリモートのリポジトリからバンドルを簡単にインストールできます。

最初にMavenにバージョンをダウンロードしてもらい(pax-url-mvnバージョン1.3.5が利用可能です)、次にファイルをインストールします(またはFelixバンドルディレクトリにコピーします)

-> install file:/YOUR_PATH_TO_MAVEN_REPO/.m2/repository/org/ops4j/pax/url/pax-url-mvn/1.3.5/pax-url-mvn-1.3.5.jar
Bundle ID: 7
-> start 7
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.net.ssl) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=javax.xml.parsers) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.cm)(version>=1.0.0)(!(version>=2.0.0))) -> [2.0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.service.url)(version>=1.0.0)(!(version>=2.0.0))) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.w3c.dom) -> [0]
DEBUG: WIRE: [7.0] osgi.wiring.package; (osgi.wiring.package=org.xml.sax) -> [0]
-> 

これで、mvn URLハンドラーを使用して、ローカルリポジトリから独自のバンドルをインストールできます。

-> install mvn:com.examples/producer/1.0.1
Bundle ID: 10
-> start 10
-> install mvn:com.examples/consumer/1.0.1     
Bundle ID: 11
-> start 11
DEBUG: WIRE: [11.0] osgi.wiring.package; (&(osgi.wiring.package=com.examples.producer)(version>=1.0.0)(!(version>=2.0.0))) -> [10.0]
Producer bound.
Consumer activate
Aloha.
-> 
于 2012-01-10T09:02:29.120 に答える
0

Equinox Declarative Servicesバンドルのフラグメントを作成しました。これにより、DSサービスのXML要素に対応する注釈でクラスをマークアップできます。はい、それ自体に制限のあるハックですが、これまでのところ、90以上のバンドルを使用するプロジェクトではうまく機能しています。興味があれば、おそらく今週はそれをクリーンアップし、文書化し、公開することができます。

于 2012-01-10T09:45:22.157 に答える