4

OSGI フレームワークを使用して、データのパッケージの処理に大きく依存するアプリケーションを作成しています。

すべてのバンドルはパッケージを処理してから、次のバンドルに送信します。私が望むのは、すべてのバンドルが並行して機能することです。したがって、すべてのバンドルを独自のスレッドまたは複数のスレッドで実行したいと考えています。「問題」は、OSGI が実際にはマルチスレッドをサポートしていないことです。同じ JVM で実行されるすべてのバンドルは 1 つのスレッドで実行されるため、同期モデルに従います。

私の考え: つまり、アプリケーションの性質は、生産者と消費者のようなものです。バンドル A は、パッケージを A に送信するために使用されるメソッドを含むサービスを提供します。これをメソッド ain と呼びましょう。バンドル B にも同様の設定があり、C も同様です。これらにはすべて aa/b/cout メソッドがあり、このメソッドでは次のバンドルのサービスを使用するため、A.aout では次のように bin を呼び出します: bservice.bin(package )。

したがって、すべてのバンドルはデータ パッケージのコンシューマーであり、プロデューサーでもあります。これにより、ExecutorService と BlockingQueues を使用するとうまくいく可能性があると思いますが、バンドル間でこれを「正しく」実装する方法がよくわかりません。コンシューマーとプロデューサー これがこの問題を回避する最善の方法であるかどうかはよくわかりません。

皆さんが助けたり、提案をしたりできることを願っています。

- 編集 -

バンドル AServiceImplementation

public class AServiceImplementation implements AService {

    private BService bservice;

    public void bindBService(BService service) {
        bservice = service;
        System.out.println("bundle gateway bound to b service");
    }

    public void unbindBService(BService service) {
        this.bservice = null;
    }

    public void process(int id) {
        bservice.transmitIn(id);        
    }
}

バンドル B BServiceImplementation

public class BServiceImplementation implements BService {

    private CService cservice;

    public void bindCService(CService service) {
        cservice = service;
        System.out.println("bundle gateway bound to b service");;
    }

    public void unbindCService(CService service) {
        this.cservice = null;
    }

    public void transmitIn(int id){
        // So if I would implement it THIS is where I would assign the data to 
        // a thread to get it processed in the process method.
        // but doesn't that make THIS method, transmitIn a bottleneck since all packages
        // need to pass through here?
        process(id);
    }

    public void process(int id) {
        // Lots of processing happens here  
    }
}

たとえば、バンドル A が transmitIn メソッドを介してデータをバンドル B に送信する方法がよくわかりません。上記のコード)

4

3 に答える 3