我们最近在我们的软件中开始使用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,演员或代理人一无所知。
现在我的问题是:这是......好吧,我确定这不可行,但是这会有效吗?还是我在这里拍脚?即使它一般都有效,我是否应该知道潜在的陷阱或安全措施?
答案 0 :(得分:0)
使用Akka调用现有代码是很正常的,这就是你在这里所做的一切。您声明ObjectManager是线程安全的,并且该软件的其他部分也使用它,因此没有理由认为引入Akka本身会导致问题。另一方面,您也可以将您的核心逻辑移动到Akka演员,然后为您的非Akka消费者提供一个简单的外观。
答案 1 :(得分:0)
看到这个对象被包装在一个代理中会有点混乱(你通常这样做是为了安全地在多个线程或执行上下文之间共享一个不同步的可变资源,而实际上它不仅仅是线程安全的它本身也可以在没有通过代理的情况下进行变异。在将整个程序迁移到基于代理的方法时可能没问题,但如果它意味着保持这种状态,那就让我感到奇怪。我宁愿不涉及代理在那种情况下。