gpt4 book ai didi

scala - Akka Slick 和 ThreadLocal

转载 作者:行者123 更新时间:2023-12-01 10:57:29 26 4
gpt4 key购买 nike

我使用 slick 将数据存储在数据库中,并使用 threadLocalSession 来存储 session 。

存储库用于处理 crud,我有一个访问 slick 存储库的 Akka 服务层。

我找到了这个链接,其中 Adam Gent 提出的问题与我在这里提出的问题很接近:Akka and Java libraries that use ThreadLocals

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

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

最佳答案

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

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

所以如果你发送一个消息 M1 然后一个消息 M2 给 actor A,那么可以保证 M1 在 M2 之前被处理。不能保证 M2 与 M1 在同一线程上处理。

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


*除非您更改他们的邮箱实现,但这是非默认行为。

关于scala - Akka Slick 和 ThreadLocal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com