akka 我可以在运行时改变持续时间的值吗?

cuxqih21  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(157)

下面的代码在主类的INIT方法中

system.scheduler()
.scheduleAtFixedRate(Duration.ZERO,
Duration.ofMinutes(settings.getInterval()),
readActor,TriggerBatch.fromTimer(),
system.dispatcher(),
ActorRef.noSender());

一旦执行了业务逻辑(receiveBuilder()方法),我就需要在运行时更改Duration.ofMinutes值
我尝试了以下解决方案

solution 1. 
  Config config = new CachingConfig(ConfigFactory.load());
  Config config1 = config.withValue("service- 
  name.scheduler.interval",ConfigValueFactory.fromAnyRef("20"));// in application.conf value for interval is =1 
  config1.getInt("service-name.scheduler.interval"); 

solution 2. 
Config overrides = ConfigFactory.parseString("service-name.scheduler.interval=20");
Config actualConfig = overrides.withFallback(ConfigFactory.load());
actualConfig.getInt("service-name.scheduler.interval");

此解决方案有效,但调度程序不采用更新值,它仍采用旧值,即service-name.scheduler.interval = 1

am46iovg

am46iovg1#

有几个选项,假设您控制了正在调用system.scheduler().scheduleAtFixedRate的init方法。
首先,调用scheduleAtFixedRate返回一个Cancellable。因此,您可以使用cancel返回Cancellable,并为调度设置一个新的时间间隔。您需要将该Cancellable传递给参与者,以便在receiveBuilder方法中访问它(您可以在创建参与者时通过Props传递它,也可以通过发送给参与者的消息传递)。
作为一种替代方法,您可以让init产生一个actor来管理消息的调度发送,该actor的状态将是scheduleAtFixedRate中的Cancellable,您可以向它发送消息以更改发送间隔。

相关问题