Java OSGi中的回调和传递对象引用

Java OSGi中的回调和传递对象引用,java,osgi,osgi-bundle,declarative-services,Java,Osgi,Osgi Bundle,Declarative Services,Bundle-A在Eclipse环境中使用声明性服务绑定Bundle-B中的包 然后Bundle-A通过传递“数据”和“类对象的引用”向Bundle-B发送一条消息,该类对象应该作为参数获得对此消息的响应。例如,发送(数据,EGU类1.this) Bundle-B应处理该消息并将响应发送回Bundle-A中等待响应的类 不幸的是,这在OSGi中是不可能的,因为它创建了一个循环。两个捆绑包不能相互导入 我想传递对类对象的引用,这样Bundle-B就可以调用它的方法来获取信息,而不是传递太多的参数,

Bundle-A在Eclipse环境中使用声明性服务绑定Bundle-B中的包

然后Bundle-A通过传递“数据”和“类对象的引用”向Bundle-B发送一条消息,该类对象应该作为参数获得对此消息的响应。例如,发送(数据,EGU类1.this)

Bundle-B应处理该消息并将响应发送回Bundle-A中等待响应的类

不幸的是,这在OSGi中是不可能的,因为它创建了一个循环。两个捆绑包不能相互导入

我想传递对类对象的引用,这样Bundle-B就可以调用它的方法来获取信息,而不是传递太多的参数,但最重要的是,Bundle-B可以跟踪它应该调用回调的类实例。我将拥有该类及其子类的多个实例

作为解决方法,我将Bundle_分为两部分,接口和实现类。这样,Bundle_A可以绑定Bundle_B,Bundle_B也可以导入Bundle_A接口的接口定义,以便它可以使用作为参数传递的对象引用


但上述方法并不干净,也不符合OSGi原则。对于这种双向沟通,有没有更好的方法?或者我做得对吗?提前谢谢

如果我理解正确,您希望使用send调用发送数据,并在B结束时被回调。Bundle A需要知道服务接口才能进行发送调用。因此,您将始终具有依赖项a->B。因此,为了避免循环,我还将在B中定义回调接口。然后,a中的某个类可以实现回调接口,并将对象实例作为第二个参数发送。B然后只需要知道回调接口。

是什么让您认为两个bundle不能相互导入?当然可以。然而,它只是在胡说模块化。。。如果两个模块在这样一个紧密的循环中直接相互依赖,那么就把它们组成一个模块。我说过这是因为每当我在两个包之间进行导入时,Eclipse都会在两个项目上显示一个红色感叹号,从而显示循环错误。那么Eclipse就是在骗你。在OSGi中,完全有可能存在循环依赖关系(尽管这不是一个好主意,正如我所描述的)。如果我理解正确,这将类似于我在问题末尾提到的解决方法,但在这种情况下,接口将位于捆绑包B中,而不是我将捆绑包a分成两部分的第三个捆绑包,作为接口和实现。为了更清楚地说明,当bundle a调用bundle B上的“send”时,将对作为第二个参数传递的对象实例调用回调。因此,我假设您也在说,作为参数传递的这个类应该实现位于B中的回调接口,对吗?是的。这很相似。但是,您的解决方案的问题是,Bundle B仍然与Bundle a的接口有连接。因此,它不是一个循环依赖项,但仍然不理想。特别是当bundle B可能也在为其他bundle提供请求时。您不希望它知道所有这些接口。