3

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

存储库用于完成 crud,我有一个 Akka 服务层可以访问 slick 存储库。

我找到了这个链接,Adam Gent 询问了我在这里要问的问题:Akka and Java library that use ThreadLocals

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

假设:两条添加用户消息(A 和 B)发送到 userservice,消息 A 被部分处理并停止,线程 B 开始在线程 A 开始处理的同一线程中处理,该线程将存储会话在它的本地会话中?

4

1 回答 1

6

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

使用 ThreadLocals 的问题在于,通常不能保证参与者在同一个线程上处理其每条消息。

因此,如果您向参与者 A 发送消息 M1,然后再发送消息 M2,则可以保证 M1 在 M2 之前被处理。不能保证 M2 在与 M1 相同的线程上处理。

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


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

于 2013-01-16T18:02:52.897 回答