3

データベースにデータを保存するためにslickを使用しています。そこで、threadLocalSessionを使用してセッションを保存します。

リポジトリは問題を解決するために使用され、私は洗練されたリポジトリにアクセスする Akka サービス レイヤーを持っています。

このリンクを見つけました。ここで、Adam Gent が私がここで尋ねていることに近いことを尋ねています: ThreadLocals を使用する Akka and Java libraries

私の懸念は、akka がメッセージをどのように処理するかです。データベース セッションを threadLocal に保存しているため、同じスレッドで 2 つのメッセージを同時に処理できますか?

例: 2 つの追加ユーザー メッセージ (A と B) がユーザー サービスに送信され、メッセージ A が部分的に処理されて停止し、スレッド A が処理を開始した同じスレッドでスレッド B が処理を開始し、セッションが保存されます。それはlocalSessionですか?

4

1 に答える 1

6

各アクターは、メッセージを受信した順序で一度に 1 つずつ処理します*。したがって、メッセージ A、B を同じアクターに送信した場合、それらが同時に処理されることはありません (もちろん、それぞれのメッセージを異なるアクターに送信した場合は状況が異なります)。

ThreadLocals の使用に関する問題は、一般に、アクターが同じスレッドで各メッセージを処理することが保証されないことです。

したがって、メッセージ M1 を送信してからメッセージ M2 をアクター A に送信すると、M1 が M2 の前に処理されることが保証されます。M2 が M1 と同じスレッドで処理されることは保証されていません。

一般に、ThreadLocals の使用は避けるべきです。アクターの全体的なポイントは、アクターが一貫性の単位であり、メッセージ パッシングを介して内部状態を安全に変更できることです。メッセージの処理を実行するスレッドをさらに制御する必要がある場合は、ディスパッチャのドキュメントを参照してください: http://doc.akka.io/docs/akka/2.1.0/java/dispatchers.html


*メールボックスの実装を変更する場合を除きますが、これはデフォルトの動作ではありません。

于 2013-01-16T18:02:52.897 に答える