我们最近开始在我们的软件中使用 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 或代理一无所知。
现在我的问题是:这是……好吧,我确定这是不可取的,但这会起作用吗?还是我在这里开枪打自己的脚?即使它通常会起作用,是否有我应该知道的潜在陷阱或安全措施?