2

このlazyListen()メソッドはlisteningフラグを true に設定し、スレッドを開始して SubscriptionTask を実行します。その後、同じJedisConnectionaddMessageListener()を使用してさらにトピックをサブスクライブします。しかし、SubscriptionTask の起動プロセスにはガードがなく、addMessageListener()そのプロセスが完了する前に への呼び出しが到着する可能性があるため、サブスクリプションが完全に失われるか、両方のスレッドが同時に同じ出力ストリームに書き込む可能性があるため、Redis には破損したメッセージが送信されます。指図。

すべてのトピックがサブスクライブ解除された後にタスクがシャットダウンされると、同様の問題が発生します。プールに返される前に、新しい subscribe コマンドが接続で送信される可能性があります。その接続が非サブスクリプション コマンドに使用されると、エラーが発生します。

この問題は、トピックにサブスクライブし、サブスクリプション タスクが完全に確立されるまで待ってから接続を許可し、サブスクライブを解除しないことで軽減できます。ただし、例外がスローされたためにタスクがシャットダウンされた場合でも発生する可能性があるため、次にトピックがサブスクライブされるときに新しい SubscriptionTask が作成されます。

4

0 に答える 0