gpt4 book ai didi

java - 多线程捆绑和服务实例

转载 作者:行者123 更新时间:2023-12-01 13:30:30 25 4
gpt4 key购买 nike

假设我有 3 个 bundle ABB1。 Bundle A 是我的应用程序的起点。 Bundle B 提供A 使用的服务的 API。 bundle B1 是服务的实现。

基本上,bundle A 有一组逐个处理的记录。没有处理记录的命令。

我希望通过同时处理记录子集来提高应用程序的性能。

我考虑了两种不同的方法: bundle A 的多个实例以及 bundle A 具有多个线程。

据我所知,不可能在 OSGi 容器中添加同一包的多个实例(即相同的 OSGi 标识)。

关于第二种可能性,bundle A 创建的每个线程都有自己的身份。而B1导出的服务需要知道使用它的线程的身份。因此,我认为 ServiceFactoy 适合这里。但是,我读到,一旦 bundle 获取了服务实例,它就会被缓存。因此,所有线程都会获得相同的服务实例。

我说得对吗?如果是,实现该模型的“正确方法”是什么?请随意向我提出一种完全不同的、对 OSGi 更友好的方法。

谢谢,米凯尔

<小时/>

编辑:

另一种可能性是修改服务接口(interface)以允许服务的使用者将他们的身份传递给服务。然后,服务将变得“无状态”,并且不需要使用 ServiceFactory。然而,需要身份的事实是一个实现细节(即仅此特定实现需要它),因此对于 future 的实现,将不会使用添加到接口(interface)的参数。这就是为什么我不愿意触摸界面。

最佳答案

OSGi 中的“正确方法”是提供无状态的服务。

正如您已经发现的,ServiceFactory 概念对您没有帮助,它仅区分调用 bundle ,而不区分线程、上下文或任何其他可以作为状态容器的内容。

如果您的服务必须跟踪状态,最好的方法是明确说明并提供某种参数来传递状态。 Balazs 提到的 RFC 是 future 的另一种选择(前提是将其纳入规范)。

关于java - 多线程捆绑和服务实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com