2016-05-11 42 views
0

我在應用程序中創建了很少的包。 我想插入這樣的軟件包: enter image description here需要在osgi包之間創建插件

只是我想插入並根據特定的fl /理由插入這些包。

+1

找到它你的問題是什麼? –

+0

如圖所示,我創建了這樣的捆綁包,並希望以傳遞特定業務邏輯的數據的方式來插入這些捆綁包。 –

+0

然後你應該編寫類和函數。 –

回答

1

這聽起來像你正在尋找一個插件模型,並選擇OSGi沒有閱讀如何做到這一點?

如果你想在OSGi中創建一個插件模型,那麼你可以使用服務。服務定義了捆綁之間的合同。所以在這種情況下,你的Core Bundle有很多地方你的業務邏輯可以「插入」。對於每個這些地方,您需要定義服務合同。服務契約由Java包定義,通常需要一個或多個接口。

現在在您的Core Bundle中,您將有組件。這些組件在OSGi中執行實際的工作。要在組件中使用插件,組件取決於插件服務。

因此可以說你有一個組件需要知道產品的價格,但價格可能來自eBay,亞馬遜或阿里巴巴。因此,我們首先設計服務合同:

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; 
} 

那麼,這如何看在你組件

@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(); 
    } 
} 

那麼如何實現SupplierPlugin?

@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()); 
    } 
} 

所以你的術語和寫在OSGi的插件實際的方式之間的關鍵區別是非常簡單的事實,捆綁或多或少無形。這項服務的設計是100%。

我已經採取了這個問題,並創建了一個小應用程序來演示這些概念。你可以在OSGi enRoute Examples repository