2011-10-19 15 views
0

私はakkaライブラリを使用しており、実行時にホットスワップを介してアクターによって実装される部分的な関数を提供しています。より簡潔なスカラ関数を定義する方法

akkaホットスワップは、PartialFunction [Any、Unit]の形式で引数をとります。私は次のように地雷を定義している:

class Fake1Reader extends AbstractReader { 

    def read: PartialFunction[Any, Unit] = { 
    case readingRequest: ReadingRequest => { 
     var reading: Reading = new ReadingImpl(readingRequest.getResourceId, "payload", 
     Calendar.getInstance.getTime, 
     readingRequest.getfrequency, readingRequest.getMappingName, 
     readingRequest.getClassificationType, 
     readingRequest.getReadingRequestId) 
     sendConsumeMessage(reading) 
    } 
    } 
} 

ので、私は新しいFake1Reader()を供給する必要があり、この機能を使用するために読みます。

applyまたはextend FunctionまたはPartialFunctionを使用して、このクラスを実行するための簡潔な方法はありますか?

+0

私は申し訳ありません、私は問題を理解していない。あなたは精緻化/精緻化できますか? –

+0

'readingRequest'ではなく' r'変数を呼び出すことで、これを約30%減らすことができます。 –

答えて

2

あなたAbstractReaderはステートレスである場合、あなたはすべての用途に不要なオブジェクトの生成を避けるために、代わりにclassobjectを定義し、不変val年代としてそこにあなたの機能を配置することができます。

package foo  
object Fake1Reader extends AbstractReader { 
    import akka.actor.Actor._ 

    val read: Receive = { 
    case readingRequest: ReadingRequest => /* implementation */ 
    } 
} 

使用方法:サイドノートとして

import foo.Fake1Reader._ 

actorRef ! HotSwap(read) 
+0

これは非常に高い並行性のアプリケーション用で、もともとは単一の関数を持つオブジェクトとして定義され、クラスに切り替えられました。私は同じオブジェクトにアクセスする多くの俳優とのシングルトンのことを心配していました。 –

+0

実際に私が探しているのは、クラス定義が実際に関数になっている可能性があるかどうかわからないということです。 –

+1

不変/不在状態の場合、共有は問題にはなりません。パフォーマンス上の問題があると思われる場合は、実際に問題があるかどうか(または条件をシミュレートする)、実際のオーバーヘッドを測定すると効果的です。 –

2

、この

はまた、コンパニオンオブジェクトakka.actor.Actorは、あなたがこのようなあなたの部分的な関数を書くことができますので、PartialFunction[Any, Unit]の別名としてReceiveタイプ定義します繰り返しの徹底的な手間を減らす:

case readingRequest: ReadingRequest => { 
    import readingRequest._ 
    var reading: Reading = new ReadingImpl(getResourceId, "payload", 
    Calendar.getInstance.getTime, 
    getfrequency, getMappingName, 
    getClassificationType, 
    getReadingRequestId) 
    sendConsumeMessage(reading) 
} 
関連する問題