Akka Slick和ThreadLocal

时间:2013-01-16 16:37:26

标签: scala akka thread-local

我正在使用slick将数据存储在数据库中,然后我使用threadLocalSession来存储会话。

存储库用于执行crud,我有一个Akka服务层可以访问光滑的存储库。

我找到了这个链接,Adam Gent在这里询问了我所要求的内容:Akka and Java libraries that use ThreadLocals

我关心的是akka如何处理消息,因为我将数据库会话存储在threadLocal中,我可以在同一个线程中同时处理两条消息吗?

假设:两个添加发送给用户服务的用户消息(A和B),并且消息A被部分处理,并且停止,线程B开始在线程A已经开始处理的同一线程中处理,这将具有会话存储在它的localSession?

1 个答案:

答案 0 :(得分:6)

每个参与者按照收到它们的顺序一次处理一个消息*。因此,如果您将消息A,B发送给同一个actor,那么它们永远不会同时处理(当然,如果您将每个消息发送给不同的actor,情况会有所不同)。

使用ThreadLocals的问题在于,通常不能保证actor在同一线程上处理它的每个消息。

因此,如果您向演员A发送消息M1然后发送消息M2,则保证在M2之前处理M1。什么不能保证在与M1相同的线程上处理M2。

通常,您应该避免使用ThreadLocals,因为actor的重点在于它们是一致性单元,您可以通过消息传递修改其内部状态。如果您真的需要对执行消息处理的线程进行更多控制,请查看调度程序的文档:http://doc.akka.io/docs/akka/2.1.0/java/dispatchers.html


*除非您更改其邮箱实施,但这是非默认行为。