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