Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Akka代理与更改相同数据的遗留代码混合使用_Java_Akka - Fatal编程技术网

Java 将Akka代理与更改相同数据的遗留代码混合使用

Java 将Akka代理与更改相同数据的遗留代码混合使用,java,akka,Java,Akka,我们最近开始在软件中使用Akka,但我们的大部分代码仍然是传统的Java代码。我现在的处境是,我想在现有类中使用Akka,但无法重写所有也使用这些类的现有代码 特别是,我有一个类来管理数据对象的映射。映射已经由不同的线程并发使用,因此manager类确保对映射的所有访问都是同步的。我现在必须创建一个清理作业,在对象变得不相关后将其从地图中删除。由于此作业应在后台异步运行,因此我使用Akka代理,即我的代码大致如下所示: Agent< ObjectManager > myObjectM

我们最近开始在软件中使用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、参与者或代理一无所知


现在我的问题是:这是。。。嗯,我相信这是不可取的,但这行得通吗?还是我在这里开枪打自己的脚?即使它在一般情况下可以工作,是否有我应该知道的潜在陷阱或安全措施?

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

如果看到此对象被包装在代理中,您通常会这样做,以确保跨多个线程或执行上下文共享不同步的可变资源,事实上,它本身不仅是线程安全的,而且在不经过代理的情况下也发生了变异。将整个程序迁移到基于代理的方法时可能没什么问题,但如果要保持这样的状态,我会感到奇怪。在这种情况下,我不想让代理参与进来。

我也同意这一点。他说,他知道这可能是不明智的,只是简单地问它是否有效。它会起作用,但在你看来,这没有多大意义。计划肯定是让类完全由代理管理,并摆脱内部同步。但我需要一段时间才能到达那里,所以在那之前我一直在寻找某种局部解决方案。谢谢你们的回答!