我在尝试使用此处解释的 Hello World 示例时遇到问题。
请注意,我刚刚修改了HelloEntity.java
文件,以便能够返回"你好,世界!最确定我的更改需要时间,因此我收到以下超时错误。 我目前正在尝试(在单个节点上执行PoC)以了解Lagom框架,并且没有部署多个节点的自由。
我也尝试修改 application.conf 中的默认 lagom.circuit breaker "call-timeout = 100s",但是,这似乎没有帮助。
以下是确切的错误消息供您参考:
{"name":"akka.pattern.AskTimeoutException: Ask timed 在 [5000 ms] 之后的 [Actor[akka://hello-impl-application/system/sharding/HelloEntity#1074448247]] 超时。发件人[null] 发送了类型为 \"com.lightbend.lagom.javadsl.persistence.CommandEnvelope\".","detail":"akka.pattern.AskTimeoutException: 在 [5000 ms] 之后在 [Actor[akka://hello-impl-application/system/sharding/HelloEntity#1074448247]] 上询问超时。Sender[null] 发送了类型为 \"com.lightbend.lagom.javadsl.persistence.CommandEnvelope\".\tat akka.pattern.PromiseActorRef$.$anonfun$defaultOnTimeout$1(AskSupport.scala:595)\tat akka.pattern.PromiseActorRef$.$anonfun$apply$1(AskSupport.scala:605)\tat akka.actor.Scheduler$$anon$4.run(Scheduler.scala:140)\tat scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Future.scala:866)\tat scala.concurrent.BatchingExecutor.execute(BatchingExecutor.scala:109)\tat scala.concurrent.BatchingExecutor.execute$(BatchingExecutor.scala:103)\tat scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scala:864)\tat akka.actor.LightArrayRevolverScheduler$TaskHolder.executeTask(LightArrayRevolverScheduler.scala:328)\tat akka.actor.LightArrayRevolverScheduler$$anon$4.executeBucket$1(LightArrayRevolverScheduler.scala:279)\tat akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRevolverScheduler.scala:283)\tat akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolverScheduler.scala:235)\tat java.lang.Thread.run(Thread.java:748)"}
问:有没有办法通过修改 application.conf 或 Hello World 项目中的任何 java 源文件来增加 akka 超时?你能帮我提供确切的细节吗? 提前感谢您的时间和帮助。
呼叫超时是断路器的超时,使用lagom.circuit-breaker.default.call-timeout
进行配置。但这不是上面的超时,上面超时的是对您的HelloEntity
的请求,该超时是使用lagom.persistence.ask-timeout
配置的。对实体的请求超时的原因是,在多节点环境中,您的实体是跨节点分片的,因此对它们的询问可能会转到另一个节点,这就是为什么在该节点没有响应的情况下需要超时的原因。
综上所述,我不认为改变ask-timeout
会解决你的问题。如果您只有一个节点,那么如果一切正常,您的实体应该立即响应。
- 这是您在日志中看到的唯一错误吗?
- 您是否在开发模式下看到了这一点(即,使用
runAll
命令),或者您是否以其他方式运行 Lagom 服务? - 您的数据库是否响应?
感谢詹姆斯的帮助/指点。 将以下行添加到 resources/application.conf 为我做了一个技巧:
lagom.persistence.ask-timeout=30s
hello {
..
..
call-timeout = 30s
call-timeout = ${?CIRCUIT_BREAKER_CALL_TIMEOUT}
..
}
Call
是服务到服务的通信。这是一个与远程服务器通信的 SeviceClient。它使用断路器。这是一个额外的服务电话。
ask
(在 lagom.persistence 的上下文中)正在向持久实体发送命令。这发生在您的 Lagom 服务所在的节点上。它没有使用断路。这是一个服务内调用。