假设我有一个链接2个演员的主管.当我的应用程序关闭时,我想优雅地关闭这些演员.调用supervisor.shutdown()会停止所有演员还是我还需要手动停止我的演员?
格拉西亚斯
我有一个非常简单的例子,我有一个Actor(SimpleActor)通过向自己发送消息来执行周期性任务.消息在actor的构造函数中调度.在正常情况下(即没有故障)一切正常.
但是如果演员必须处理错误呢?我有另一个演员(SimpleActorWithFault).这个演员可能有错.在这种情况下,我通过抛出异常来生成一个.当故障发生时(即SimpleActorWithFault抛出异常),它会自动重启.但是,这次重启会扰乱Actor内部的调度程序,该调度程序不再作为例外.如果故障发生得足够快,就会产生更多的意外行为.
我的问题是在这种情况下处理故障的首选方法是什么?我知道我可以使用Try块来处理异常.但是,如果我扩展另一个演员,我不能在超类中放置一个演员,或者某些情况下,当我是一个例外的故障发生在演员身上.
import akka.actor.{Props, ActorLogging}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import akka.actor.Actor
case object MessageA
case object MessageToSelf
class SimpleActor extends Actor with ActorLogging {
//schedule a message to self every second
context.system.scheduler.schedule(0 seconds, 1 seconds, self, MessageToSelf)
//keeps track of some internal state
var count: Int = 0
def receive: Receive = {
case MessageA => {
log.info("[SimpleActor] Got MessageA at %d".format(count))
}
case MessageToSelf => {
//update state and …Run Code Online (Sandbox Code Playgroud) 让我们假设我有一个简单的第三方(即我不能修改它)类定义如下:
class Price(var value: Int)
Run Code Online (Sandbox Code Playgroud)
是否可以将此类的实例与某些模式匹配?
例如,我想实现功能:
def printPrice(price: Price) = {
// implementation here
}
Run Code Online (Sandbox Code Playgroud)
...打印price is {some value}每个price有value <= 9000和price is over 9000所有其他情况.
例如,调用:
printPrice(new Price(10))
printPrice(new Price(9001))
Run Code Online (Sandbox Code Playgroud)
应该打印:
price is 10
price is over 9000
Run Code Online (Sandbox Code Playgroud)
如何printPrice使用模式匹配实现?
默认情况下,您的Play应用程序将全面打响(编译Global的onStart调用等),你做的HTTP请求到它之后.
有没有办法禁用这个延迟加载并使Play应用程序编译代码并在应用程序进程运行后执行启动?
PS:我正在使用Play 2.3.
更新:正如Ryan所指出的,懒惰负载只发生在开发中.模式.尽管如此,我仍然需要禁用它,尽管这只与在dev中运行的应用程序相关.模式.
我经常发现自己需要重新创建容器,并对docker run最初用于容器的参数进行细微修改(例如更改已发布的端口、网络、内存量)。
现在我正在制作图像并运行它们来代替旧容器。
这工作正常,但我并不总是docker run保存原始参数,有时(特别是当有很多东西要定义时)恢复它们变得很痛苦。
有没有办法docker run从现有容器中恢复参数?
如果远程演员由于断电而无法使用监督策略可以处理这种情况吗?
我编写了示例并且我关闭了远程actor系统,但似乎监督策略只考虑了远程actor一旦达到的异常.
由于我不是阿卡专家,我想知道这是否可以实现.
版:
我已经实现了对事件的订阅,这些事件表明连接中发生了错误.我仍然需要访问发件人最初发送的邮件,这样邮件就不会丢失.
我想用谷歌眼镜做的很简单:创建/显示谷歌玻璃的世界卡
问题是::
当我添加这个:
import com.google.android.glass.app.Card
Run Code Online (Sandbox Code Playgroud)
我明白这个:
Cannot Resolve Symbol 'google'
Run Code Online (Sandbox Code Playgroud)
我这样做了:
最小和目标SDK版本:15(只有一个Glass版本,因此最小和目标SDK是相同的.)编译:Glass Development Kit Sneak Peek
并且我对gradel.build进行了更改[编译sdk版本...它是15 /更改为以下内容]
android {
compileSdkVersion "Google Inc.:Glass Development Kit Sneak Peek:15"
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 15
targetSdkVersion 15
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得我错过了一些简单/设置问题/不确定它是什么.
有什么建议吗?
我有一个可运行的jar,我希望在集成测试开始(on pre-integration-test)之前在一个新进程中运行,并在集成测试完成(on post-integration-test)后终止它.
我可以使用的一件事是maven-antrun-plugin或exec-maven-plugin来启动新进程pre-integration-test但是如何终止呢?
也许有一个更好的解决方案,我想要实现的目标?
PS:我在Windows和Linux上都构建了我的项目,因此可移植性对我很重要.
我正在播放haskell中的异常,偶然发现了一件我无法理解的事情.
在GHCi我做:
Prelude Control.Exception> let thrower = (read "A") :: Int
Prelude Control.Exception> :{
Prelude Control.Exception| let main = do
Prelude Control.Exception| x <- (try $ return thrower) :: IO (Either SomeException Int)
Prelude Control.Exception| print x
Prelude Control.Exception| :}
Prelude Control.Exception> main
Run Code Online (Sandbox Code Playgroud)
这定义了thrower我的测试表达式,它会因异常而失败.
然后我定义main将表达式try包装进(将其包装到IO第一个,因为try接受IO)然后将其从IO(由...生成try)和print它展开.
到目前为止,一切看起来都很棒 - main在repl中进行评估会将异常包含在以下内容中:
Right *** Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试编译并执行与应用程序相同的代码:
module Main where
import Control.Exception
thrower …Run Code Online (Sandbox Code Playgroud)