我对Scala相当陌生,我正在开发一个应用程序(库),该应用程序是第三方服务的客户端(我无法修改服务器端,并且使用自定义二进制协议)。我使用Netty进行网络连接。
我想设计一个API,该API应该允许用户:
我不确定该如何设计。在研究Scala时,我偶然发现了有关Actor模型的大量信息,但是我不确定是否可以在其中应用它,以及如何应用。
我想就应该采取的方式提出一些建议。
这看起来像是Obesrvable模式的一个很好的例子。此模式来自.NET的Reactive Extensions,但也可用于Java和Scala。该库由Netflix提供,质量非常好。
这种模式具有良好的理论基础---从类别理论上讲,它是迭代器的对偶。但更重要的是,它具有许多实用的想法。特别是它可以很好地处理时间,例如,您可以限制想要获得的事件发生率。
通过观察,您可以平均地处理事件。在.NET中,它看起来很像SQL查询。您可以注册某些事件(“ FROM”),过滤它们(“ WHERE”),最后处理它们(“ SELECT”)。在Scala中,您可以使用标准的monadic API(地图,过滤器,flatMap),当然也可以使用“表达式”。
一个例子看起来像
stackoverflowQuestions.filter(_.tag == "Scala").map(_.subject).throttleLast(1 second).subscribe(println _)
可观测对象消除了基于事件的系统带来的许多问题
您的API应该为您拥有的每个事件源提供一个易于理解的内容。对于过程调用,您提供了一个将函数调用映射到可观察对象的函数。该函数将调用远程过程并通过可观察的结果提供结果。
将以下依赖项添加到您的build.sbt中:
libraryDependencies += "com.netflix.rxjava" % "rxjava-scala" % "0.15.0"
然后,您可以使用以下模式将回调转换为可观察的(鉴于您的远程API具有注册和注销回调的某种方式):
private val callbackFunc : (rx.lang.scala.Observer[String]) => rx.lang.scala.Subscription = { o =>
val listener = {
case Value(s) => o.onNext(s)
case Error(e) => o.onError(o)
}
remote.subscribe(listener)
// Return an interface to cancel the subscription
new Subscription {
val unsubscribed = new AtomicBoolean(false)
def isUnsubscribed: Boolean = unsubscribed.get()
val asJavaSubscription: rx.Subscription = new rx.Subscription {
def unsubscribe() {
remote.unsubscribe(listener)
unsubscribed.set(true)
}
}
}
如果您有一些特定的问题,请问我,我可以完善答案
Martin Odersky等人的课程非常不错。在课程中,涵盖了可观察性和其他反应技术。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句