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

特别是,我有一个管理数据对象映射的类。该映射已被不同的线程并发使用,因此manager类确保对映射的所有访问都已同步。现在,我必须创建一个清理作业,以在对象变得不相关之后将其从地图中删除。由于此工作应该在后台异步运行,因此我使用了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或agent一无所知。

现在我的问题是:这是...好吧,我确定这是不明智的,但是可以吗?还是我在这里射自己的脚?即使可以正常使用,我是否应该了解潜在的陷阱或安全措施?

最佳答案

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

关于java - 将Akka代理与可更改相同数据的旧代码混合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13866304/

10-16 10:15