2016-05-19 9 views
2

var定義なしで定期的に更新された値を実装しようとしています。定義方法スカラーでvar定義なしの定期的な更新値

たとえば、Webサーバーがあり、ユーザーの要求を処理するために他のサーバーのヘルスチェックを行う必要があるとします。ヘルスチェックの結果は、すべてのユーザー要求アクションによって参照されます。 新しいリクエストが処理されるたびにヘルスチェックを実行すると膨大な費用がかかります。代わりに、たいてい5分ごとにヘルスチェック結果の値を更新したいと思います。

これを実装するのにvarを使用すると簡単です。

private var result = false 
    private var lastUpdated = 0L 
    private val INTERVAL = 1000L * 60 * 5 

    def helthCheckResult = { 
    System.currentTimeMillis() match { 
     case currentTime if currentTime > lastUpdated + INTERVAL => 
     result = !result // actual code should call heathcheck impl 
     lastUpdated = currentTime 
     result 
     case _ => 
     result 
    } 
    } 

やアッカ

class HeathCheckActor(implicit system: ActorSystem) extends Actor { 
    private var result = false 
    system.scheduler.schedule(0 seconds,5 minutes,self,"update") 
    def receive = { 
    case "update" if sender == self => 
     result = !result // actual code should call heathcheck impl 
    case "get" => 
     sender ! result 
    } 
} 

で、彼らは状態を保持するために結果varを使用しています。私が達成したいのは、varなしでこれを実装することです。

これを行う方法はありますか?

あらゆる種類の情報/ヒントが評価されます。

編集

は、私が達成したいものを聞いて少し悪い例でした。 たとえば、resultBooleanのような単純な最終状態ではなく、Intの場合resultは、任意の値のIntクラウドを表すことができます。 別の言い方をすれば、Akka FSMのようなものは使用できません。

答えて

3

私は、この例で行うとアッカが使用する使用してどのようなプレーンな機能の場合は、あなたのケース

override def receive: Receive = receiveWithLastResult(false) 

def receiveWithLastResult(lastResult: Boolean): Receive = { 
    case "update" if sender == self => 
     context.become(receiveWithLastResult(!lastResult)) 
    case "get" => 
     sender ! result 
    } 

context.become

を(時には虐待)、あなただけ以前を受け取ることができます値、および状態を保持するためにVARを使用することが絶対的に有効であるとして、あなたがそれをしたい理由を知ることが重要である最初は新しいもの

case class YourValues(result: Boolean, lastUpdated: Long) 
    def helthCheckResult(previous: YourValues) = { 
    System.currentTimeMillis() match { 
     case currentTime if currentTime > lastUpdated + INTERVAL => 

     YourValues(result = !previous.result, lastUpdated = currentTime) 

     case _ => 
     previous 
    } 
+0

ありがとうございます。あなたは値を保持する場所であるコードを提供していただけますか?私はあなたのコードが単に 'var'を別の場所に移動していると感じています。 – suish

-1

を返します特に俳優にとっては、国家分離のためにも意味があります。

そして、一般的には「保持状態」を避けるために、なぜ状態が保持されるのかを理解することが重要です。

誰に興味がありますか?誰がいつ、いつ、そして、なぜそれを質問しますか?状態の変化に反応するのは誰ですか?

おそらく、varの "状態"をオブザーバの概念で置き換えるだけでよいでしょう。関心のある部分には "状態の変更についての通知"があります。

関連する問題