我正在使用 OSGI 框架制作一个严重依赖数据包处理的应用程序。
每个包处理一个包,然后将它发送给下一个包。我想要的是每个包并行工作。所以我想让每个包都在它自己的线程或多个线程中运行。 “问题”是 OSGI 并不真正支持多线程。在同一个 JVM 上运行的每个 bundle 都只在 1 个线程中运行,因此它遵循同步模型。
我的想法: 所以应用程序的性质有点像生产者消费者。 Bundle A 提供了一种服务,该服务具有用于将包发送到 A 的方法,我们称其为方法 ain。 Bundle B 有类似的设置,C 也有。它们都有一个 a/b/cout 方法,在这个方法中它们使用下一个 bundle 的服务,所以在 A.aout 中你可以这样调用 bin:bservice.bin(package ).
所以每个 bundle 都是数据包的消费者和生产者,这让我认为使用 ExecutorService 和 BlockingQueues 可能有效,但我不太确定如何在 bundle 之间以及所有他们既是消费者又是生产者,我不太确定这是否是解决此问题的最佳方法。
我希望你们能提供帮助和/或提出任何建议。
-- 编辑--
bundle A 服务实现
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);
}
}
bundle B B服务实现
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
}
}
我真的不明白如何做到这一点,例如 bundle A 通过 transmitIn 方法将数据传输到 bundle B 而 transmitIn 不会成为瓶颈,因为我会在该方法中将我的“工作分配”分配给不同的线程(如上面的代码所示)
最佳答案
嗯,完全是误会。 OSGi 不关心你用并发做什么,它的一大优势是它不会像许多应用程序服务器那样改变计算模型。从束或包的角度来看,线程是完全无关紧要的。因此,任何 Java 解决方案都适用于此。
在您的示例中,所有处理都将发生在初始调用者线程上,即调用 AServiceImplementation 的线程。如果你想并行处理,你可以为你提交的每个任务使用一个执行器,这就是执行器派上用场的模式。这使得处理异步,因此您没有返回值。请注意,处理将受到您提供的执行器中可用线程数的限制。您还必须非常小心地编写处理代码,以处理非局部变量的正确同步。
另一种方法是排队。每个服务调用都会创建一个包含任务信息的对象,然后将此对象发布到阻塞队列中。在 OSGi 激活器中,您创建一个读取队列并处理它的线程。在这个模型中,你可以处理而不用担心(太多)并发性,因为所有处理总是发生在同一个线程中。出于性能原因,您可以启动多个线程,但处理起来要困难一些。
但是,我的建议是跳过此优化并首先构建尽可能简单的系统。如果它运行了,并且您发现有性能问题,那么现在就可以开始担心这些问题了。以您目前的理解水平,恐怕您有机会针对“可能的”问题创建高度复杂的解决方案。
关于java - 在 OSGI 中使 bundle 并行、线程化运行的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805065/