2016-05-11 9 views
0

Ich hatte einige Bündel in meiner Anwendung erstellt. Ich will diese Bündel wie diese stopfen: enter image description hereMüssen Plugin zwischen OSGI-Bundles erstellen

Einfach ich diese Pakete in und Stecker heraus verstopfen möchten, wie ich für eine bestimmte fl/Grund wollen.

+1

finden Was ist Ihre Frage? –

+0

Wie im Bild gezeigt, habe ich solche Bündel erstellt und möchte diese so verbinden, dass sie Daten für eine bestimmte Geschäftslogik übergeben. –

+0

Dann sollten Sie Klassen und Funktionen schreiben. –

Antwort

1

Es klingt, als ob Sie nach einem Plug-in-Modell suchen und OSGi wählen, ohne dazu zu lesen, wie das geht?

Wenn Sie ein Plugin-Modell in OSGi erstellen möchten, verwenden Sie Dienste. Services definieren einen Vertrag zwischen Bundles. In diesem Fall hat Ihr Core-Bundle eine Reihe von Orten, an denen Sie Ihre Geschäftslogik "einbinden" können. Für jede dieser Stellen müssen Sie den Servicevertrag definieren. Ein Servicevertrag wird durch ein Java-Paket definiert, für gewöhnlich werden eine oder mehrere Schnittstellen benötigt.

Jetzt in Ihrem Core Bundle haben Sie Komponenten. Diese Komponenten erledigen die eigentliche Arbeit in OSGi. Um die Plugins in einer Komponente zu verwenden, hängt die Komponente von den Plugin-Diensten ab.

Also sagen wir, Sie haben eine Komponente, die den Preis eines Produkts wissen muss, aber dieser Preis kann von eBay, Amazon oder Ali Baba kommen. So gestalten wir zuerst den Servicevertrag:

public interface SupplierPlugin { 
    Set<Product> findProducts(String query) throws Exception; 
    boolean buy(String id, String count) throws Exception; 
    String getSupplierId() throws Exception; 
} 

public class Product extends DTO { 
    public String  supplier; 
    public String  id; 
    public String  name; 
    public String  description; 
    public Price  price; 
    public int  inStock; 
    public Duration deliveryTime; 
} 

Wie funktioniert dieser Blick in Ihre Komponente?

@Component 
public class OrderProduct implements REST { 

    @Reference 
    volatile List<SupplierPlugin> suppliers; 

    public Product findProducts(String query) { 
     Product cheapest=null; 

     return suppliers.stream() 
      .flatMap(supplier -> supplier.findProducts(query)) 
      .sorted((a,b) -> a.price.compareTo(b.price)) 
      .first(); 
    } 

    public boolean buy(String supplier, String productId) {   
     return suppliers.stream() 
      .filter(supplier -> 
        supplier.getSupplierId().equals(supplier)) 
      .map(supplier -> supplier.buy(productId)) 
      .findFirst(); 
    } 
} 

Wie würden Sie ein SupplierPlugin implementieren?

@Component 
public class TestSupplier implements SupplierPlugin { 

    @Reference 
    DTOs dtos; 

    static Product[] products = { 

    }; 

    @Activate 
    void activate() { 
     InputStream in = TestSupplier.class 
      .getResourceAsInputStream("products.json"); 
     products = dtos.decoder(Product[].class).get( 
    } 

    public Set<Product> findProducts(String query) { 
     return Streams.of(products) 
      .filter(product -> product.description.contains(query)) 
      .collect(Collectors.toSet()); 
    } 
} 

So ist der entscheidende Unterschied zwischen Ihrer Terminologie und dem tatsächlichen Weg Plugins in OSGi zu schreiben ist wirklich die einfache Tatsache, dass Bundles ist mehr oder weniger unsichtbar. Das Design ist 100% um die Dienste herum.

Ich habe diese Frage gestellt und eine kleine Anwendung erstellt, um die Konzepte zu demonstrieren. Sie können es auf der OSGi enRoute Examples repository

Verwandte Themen