【问题标题】:Akka Slick and ThreadLocalAkka Slick 和 ThreadLocal
【发布时间】:2012-12-31 01:22:17
【问题描述】:

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

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

我找到了这个链接,Adam Gent 在这里提出了与我所问的问题类似的问题:Akka and Java libraries that use ThreadLocals

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

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

【问题讨论】:

标签: scala akka thread-local


【解决方案1】:

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

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

所以如果你先发送一条消息 M1,然后再发送一条消息 M2 给 Actor A,就可以保证 M1 在 M2 之前被处理。不能保证 M2 与 M1 在同一线程上处理。

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


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

【讨论】:

  • 感谢 Endre,假设我们有 Actor A 和 B,我将消息 M1 和 M2 发送给 Actor A,M3 和 M4 发送给 Actor B,考虑到 M1 已启动,但尚未已经完成了,是否有可能在 M1 所在的同一线程上处理 M3 或 M4 启动?
猜你喜欢
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多