2013-01-24 108 views
0

因此,我認爲解釋它的最佳方式是使用示例。OSGi請求式服務? (多個實例)

發佈服務X時,需要註冊它的一個實例。同樣的實例答案儘可能多的客戶稱之爲。

我想知道是否有辦法按需實例化它的許多實例。與客戶端c1在實例x1中請求服務X一樣,客戶端c2與實例x2通信,並在處理完每個實例後銷燬。

因爲它適用於Web服務器。每個客戶端方法調用都是一個請求,並且在它響應之後,該請求被銷燬。

我看到了一些關於多個參考文獻的答案,但我不太確定它們是否與我所有的問題完全相同。

三江源

回答

0

的OSGi目前支持ServiceFactory這使得供應商爲每個消費者捆綁創造一個獨特的服務實例。這可能已足夠滿足您的需求

但它不允許提供程序爲捆綁中的服務的每個請求提供唯一的服務實例。我正在研究R6的提案,以允許爲每個請求創建唯一的服務實例。希望它會被R6規範所接受。

+0

非常感謝您的幫助。請您指出我在哪裏可以找到一些文檔,說明每個請求的實例是不可能的? –

+0

好吧,我的疑問來自以下情況:我有一個簡單的2捆綁應用項目。第一個通過HTTP通過SOAP發佈服務,並且僅用作另一個bundle的接口,這是我應用程序的核心,有時可以花費盡可能多的秒數。問題是(從我得到的)我由於WS提供的針對單個實例捆綁服務的線程請求,無法正確地將我的請求從WS捆綁派發到我的Core捆綁包。 –

1

幾年前,我嘗試在RFC Genuine Service Factories中以通用方式回答此問題。經過很多艱難的思考,我得出結論:解決方案非常簡單。只需註冊一個工廠服務。因此,如果您想要創建Foo,只需註冊一個FooFactory服務......這可以讓您獲得參數的所有好處,類型安全等。如果想要一個通用解決方案,只需創建一個工廠類型:

public interface Factory<T> { T create(); } 

@Component 
public class FooFactoryImpl implements Factory<Foo> { 
    public Foo create() { ... } 
} 

但是,我發現最好的方法就是創建一個FooFactory,因爲這樣可以提供類型安全性,因爲泛型類型通常需要強制轉換。它還爲您提供了可擴展性,參數以及大部分語義的適當文檔。

我知道的所有其他解決方案都傾向於大量鑄造和繞過類型系統。聲明式服務中的工廠組件是一種情況。我認爲OSGi服務註冊中心的職責是給你一個處理。正如所有的技術一樣,添加額外的語義非常誘人,因爲它通常很接近。我認爲這種情況對於Java而言要比OSGi好得多。把事情簡單化。