我正在使用OSGI框架來製作嚴重依賴於處理數據包的應用程序。在OSGI中使並行線程運行的最佳方式是什麼使OSGI中的線程並行運行的最佳方式
每個包都處理一個包,然後將其發送到下一個包。我想要的是每個捆綁包都是平行的。所以我想讓每個bundle都運行在它自己的Thread或多個Threads中。 '問題'是OSGI並不真正支持多線程。運行在同一個JVM上的每個bundle僅運行在1個線程中,因此它遵循同步模型。
我的想法: 因此,應用程序的性質有點像生產者消費者喜歡的。 Bundle A提供了一個服務,其中包含一個用於將包發送給A的方法,我們稱之爲方法ain。 Bundle B也有類似的設置,C也是如此。它們都有aa/b/cout方法,在這種方法中它們使用下一個bundle的服務,所以在A.aout中你會像這樣調用bin:bservice.bin(package )。因此,每個bundle都是數據包的使用者和生產者,這使我認爲使用ExecutorService和BlockingQueues可能會起作用,但我不太清楚如何在bundle之間「正確」實現這一點,並且與所有他們既是消費者又是生產者我不太確定這是否是解決這個問題的最佳方式。
我希望你們能幫忙和/或有任何建議。
- 編輯 -
捆綁 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
}
}
我真的不知道如何使其成爲例如包一個通過transmitIn方法將數據傳輸到捆綁B,而不傳輸是瓶頸,因爲我會讓我的「workdistribution」在該方法不同的線程(如被看見在上面的代碼中)
所以如果我只是保持原樣,不增加額外的多線程功能,並且假設5個不同的bundle都使用bundle A,他們都使用他們的a服務調用:servicea.startprocessingdata(包)。捆綁包A將如何迴應?捆綁包A能夠處理這些「一次全部」,還是將它們同步處理? – Spyral
OSGi無法解決您的併發需求。但是您當然可以使用ExecutorService和BlockingQueues以及其他機制來構建滿足您需求的解決方案。 –
通過添加一些代碼,我的問題更加清晰: – Spyral