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
finden Was ist Ihre Frage? –
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. –
Dann sollten Sie Klassen und Funktionen schreiben. –