我正在使用akka库并提供一个部分函数,由演员在运行时通过热插拔实现。
akka hot swap采用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()。read。
使用应用或扩展Function或PartialFunction是否还有更简洁的方法来执行此类?
答案 0 :(得分:2)
如果您的AbstractReader
是无状态的,则可以定义object
而不是class
,以避免在每次使用时创建不必要的对象,并将您的函数设置为不可变的val
'第
此外,伴随对象akka.actor.Actor
将类型Receive
定义为PartialFunction[Any, Unit]
的别名,因此您可以像这样编写部分函数:
package foo
object Fake1Reader extends AbstractReader {
import akka.actor.Actor._
val read: Receive = {
case readingRequest: ReadingRequest => /* implementation */
}
}
用法:
import foo.Fake1Reader._
actorRef ! HotSwap(read)
答案 1 :(得分:2)
作为旁注,这减少了重复的苦差事:
case readingRequest: ReadingRequest => {
import readingRequest._
var reading: Reading = new ReadingImpl(getResourceId, "payload",
Calendar.getInstance.getTime,
getfrequency, getMappingName,
getClassificationType,
getReadingRequestId)
sendConsumeMessage(reading)
}