2011-10-19 4 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

불변/has-no-state이면 모든 공유가 문제가되지 않습니다. 성능 문제가 있다고 생각되면 실제로 하나의 조건을 시뮬레이트하고 실제 오버 헤드를 측정하는 것이 도움이 될 수 있습니다. –

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) 
} 
관련 문제