【问题标题】:Data transmission during ipojo reconfigurationipojo 重新配置期间的数据传输
【发布时间】:2014-11-19 12:55:55
【问题描述】:

我在重新配置期间遇到了与ipojo 组件之间的数据传输相关的问题。 这是一个例子:

  • 组件Calcul_1 提供计算服务以返回值(a+b)(例如:f(a,b)=> (a+b)
  • 组件Calcul_2 提供计算服务以返回值(a*b)(例如:f(a,b)=> (a*b)

这两个组件实现了相同的计算服务(例如:f)。

  • 现在,我有一个组件CallCalcul 使用Calcul_1 的计算服务。组件CallCalcul 调用组件Calcul_1 中的f(5,6)。然后,CallCalcul component 收到 11 的值。

问题:

  1. Calcul_1CallCalcul 接收到值(5,6)(尚未计算)时,CallCalcul 通过将连接器更改为Calcul_2 重新配置,即它绑定到Calcul_2。在这种情况下,如何将(5,6)Calcul_1传输到Calcul_2并将(5*6=30)返回到CallCalcul

  2. Calcul_1 接收到来自CallCalcul 的值(5,6)(并计算它们,即5+6=11)时,CallCalcul 重新配置。在这种情况下,如何将11 传输到Calcul_2 并将这个值返回给CallCalcul

【问题讨论】:

  • 您是否真的遇到过服务提供者在方法中间发生变化的问题,或者这只是您认为可能发生的场景?另外,您是否使用 Requires 注释(或等效的 xml)注入您的服务依赖项?
  • 这是一个我确信它会发生的场景。我用 Requires 注入我的服务依赖项。注意:Calcul_1 和Calcul_2 两个组件实现相同的服务。我使用过滤器将 CallCalcul 的绑定更改为服务

标签: java ipojo


【解决方案1】:

据我所知,ipojo 会处理同步,因此不会发生这种行为。

来自ipojo documentation

同步由 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);
}

【讨论】:

  • 感谢您的回复。但我不明白为什么一个组件休眠,所有组件都暂停?尽管它们之间没有依赖关系。
  • 你说的是对 thread.sleep() 的调用吗?这只是您可以在可运行文件中实现的简单循环的一个示例(如果没有它,我想指出的问题仍然会发生)。组件没有“暂停”;我只是说当方法在你的组件中执行时,只要你的方法没有返回,ipojo 就确保myService 引用同一个实例。如果您以相同的方法调用myService 两次,您可以确定每次的计算服务都是相同的(乘法或加法,但不是一个)。
  • 感谢您的帮助。我同意您的观点,要求组件将在重新配置之前等待接收结果。正如你所说,我使用 Thread.sleep() 进行了测试,它导致了另一个问题stackoverflow.com/questions/27039926/…。我想创建彼此独立的组件。 :(
  • 我重新尝试了您的示例,但结果相同。将服务调用放在另一个辅助方法中与不调用没有区别。
猜你喜欢
  • 2015-01-30
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多