在重新配置期间,我在ipojo
组件之间的数据传输方面遇到问题。下面是一个示例:
- 组件
Calcul_1
提供计算服务以返回值(a+b)
(例如:f(a,b)=> (a+b)
) - 组件
Calcul_2
提供计算服务以返回值(a*b)
(例如:f(a,b)=> (a*b)
)
这两个组件实现相同的计算服务(例如:f
)。
- 现在,我有一个使用
Calcul_1
计算服务的组件CallCalcul
。组件CallCalcul
调用组件Calcul_1
中的f(5,6)
。然后,CallCalcul component
接收值 11。
问题:
-
当
Calcul_1
从CallCalcul
接收到(5,6)
值(尚未计算)时,CallCalcul
通过将连接器更改为Calcul_2
来重新配置,即绑定到Calcul_2
。在这种情况下,如何将(5,6)
从Calcul_1
传输到Calcul_2
,并将(5*6=30)
返回到CallCalcul
? -
当
Calcul_1
从CallCalcul
收到(5,6)
的值(并计算他们的值,即 5+6=11)时,CallCalcul
重新配置。在这种情况下,如何将11
传输到Calcul_2
并将此值返回给CallCalcul
?
据我所知,ipojo 处理同步,因此不会发生这种行为。
来自 ipojo 文档:
同步由 iPOJO 管理。一旦您"接触"方法中的依赖项,iPOJO 就会确保您将这些对象保留到方法结束。嵌套方法将共享相同的服务对象集。
因此,只要您使用相同的方法(或嵌套方法),您就知道您的服务自您第一次访问它以来就没有被修改过(我假设您对f
的调用是同步的,所以如果我错了,请告诉我)。Calcul_1
组件不会在方法调用过程中被Calcul_2
替换。
但是,我想这也意味着,如果您希望重新配置生效,则必须使用您的服务到达方法的末尾。例如,如果您的组件启动一个具有以下函数的线程:
public void run() {
while(!end) {
//while this function is running, myService will not change
int var = myService.f(a,b);
// ... do something with the result
Thread.sleep(SLEEP_TIME);
}
}
如果此函数继续运行,即使修改了筛选器,ipojo 也不会将新服务绑定到myService
。应将对服务的调用放在另一个帮助程序方法中。它将允许 ipojo 在重新配置组件时锁定对服务的访问。例如:
public void run() {
while(!end) {
// the service may not be the same each time because this function does
// not directly use the service
int var = callDynamicService(a,b);
// ... do something with the result
Thread.sleep(SLEEP_TIME);
}
}
private int callDynamicService(int a, int b) {
return myService.f(a,b);
}