java - 在 OSGI 中使 bundle 并行、线程化运行的最佳方法是什么

标签 java multithreading osgi

我正在使用 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/

相关文章:

java - 如何使 Eclipse 使用 bnd 注释自动生成 OSGi 声明性服务捆绑组件 XML?

osgi - OSGi框架如何设置Bundle ID?

java - 非法参数异常 : URI is not hierarchical with runable . jar 文件

java - 使用 Java 在 Windows 和 OS X 上保存程序配置文件的最佳位置?

java - Java套接字错误 "Thread-0"

IOS递归分派(dispatch)异步

multithreading - 如何在 Cappuccino 中使用多线程

Java - 将 double /浮点四舍五入到小数点后两位时出现意外结果

Java 每月计时器

java - 如何在单线程中执行OSGI包的激活和停用方法