我在做什么:

我正在使用play 2.5.7(java)并尝试构建REST应用程序。
当我接到控制器的电话时,我问第一个参与者,这个参与者只能解决部分问题(获取其他数据),该问题需要转发给另一个使用请求数据和其他数据来更新更多数据的参与者,将异步void调用(告诉)发送给另一个参与者,并响应控制器。所有这四个(4)角色都与Guice一起注入了其他角色或控制器中。

通话流程:

控制器-(Patterns.ask)-> actor1-(actor.forward)-> actor2-(actor.forward)-> actor3(-tell-> actor4)和-(sender()。tell )->控制器。

问题:

这适用于前4个通话。然后在actor1.forward上,每个连续的请求都会失败; Patterns.ask超时。 System.out在actor1.forward工作之前就行了,但实际的转发却没有。无论超时值(甚至尝试20s)。请求中未做任何更改;每次我都点击邮递员中的发送按钮。

我有两个问题:


为什么是4?为什么在第四个请求后失败?是一些配置吗?我应该在配置中寻找什么?
我对参与者所做的一切是构建REST Web服务的正确方法吗?


更新:我发现了问题;这是由于通过池消耗了Redis连接并且从不释放它们引起的。但是我还有第二个问题,我在这里做什么是可取的?

最佳答案

当然,这可能是一个合理的设计。但是,我会考虑使用Future返回方法是否更可维护,除非您的工作流需要在多个移动部件或内部状态之间有一些复杂的协议。如果您的处理不能很好地映射到异步方法调用,那么也可能值得考虑Akka Streams

基本上,参与者是一个非常底层的工具。在您需要它们的范围内,我将尽量减少直接使用它们的应用程序的表面积。在可能的情况下,更高级别的抽象会更好。

关于java - Akka:这是使用Actors构建REST Web服务的正确方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39617318/

10-11 21:58
查看更多