1

我们最近开始在我们的软件中使用 Akka,但我们的大部分代码仍然是“传统”的 Java 代码。我现在处于想要将 Akka 与现有类一起使用的位置,但无法重写所有也使用这些类的现有代码。

特别是,我有一个管理数据对象映射的类。该地图已经被不同的线程同时使用,因此管理器类确保对地图的所有访问都是同步的。我现在必须创建一个清理作业,在它们变得无关紧要后从地图中删除它们。由于该作业应该在后台异步运行,因此我使用了 Akka 代理,即我的代码看起来或多或少像这样:

Agent< ObjectManager > myObjectManagerAgent = new Agent< ObjectManager >( myObjectManager, myActorSystem );

...

myObjectManagerAgent.sendOff(
    new Function< ObjectManager, ObjectManager >()
    {
        @Override
        public ObjectManager apply( final ObjectManager objectManager )
        {
           ...

           objectManager.erase( irrelevantObjectIds );

           return objectManager;
        }
     }
  );

但是,同样的对象管理器也可以直接从软件中的其他几个地方写入,无需代理。如前所述,这种访问是线程安全的,但对 Akka、actor 或代理一无所知。

现在我的问题是:这是……好吧,我确定这是不可取的,但这会起作用吗?还是我在这里开枪打自己的脚?即使它通常会起作用,是否有我应该知道的潜在陷阱或安全措施?

4

2 回答 2

0

使用 Akka 调用现有代码是很正常的,这就是您在这里所做的一切。您声明 ObjectManager 是线程安全的,并且软件的其他部分也使用它,因此没有理由认为引入 Akka 会固有地导致问题。另一方面,您也可以将核心逻辑移动到 Akka actor 中,然后为您的非 Akka 消费者提供一个简单的外观。

于 2012-12-13T18:53:25.640 回答
0

看到这个对象被包装在一个代理中会有点令人困惑(您通常这样做是为了确保在多个线程或执行上下文之间共享一个不同步的可变资源是安全的,而实际上它不仅本身是线程安全的但也没有经过代理就发生了突变。将整个程序迁移到基于代理的方法可能没问题,但如果它打算保持这种状态,我觉得很奇怪。我宁愿根本不让代理参与那个案子。

于 2012-12-14T14:47:52.203 回答