, ProcessBuilder :... , ...
- , . ( , ):
- process =
- thread = ( )
- actor = light-weight ( ).
- . , O/S , . ( ). , CGI- - O/S-- - -. , : .
, , , . , , 10 , , 100.
?
, myExecutable.sh Scala, . , .
, /, , / .
: (1) , (, 10) (2) (, 100), ProcessIO (3), , /, , . : ; 100 , , , - .
: (1) (, 10) (2), (.. ) (3), / ProcessIO, , . : , ; .
: (1) , for , (2) (10) (3) for-loop, ProcessIO ( - )
- ?
, . ( , /). " scala " , . , Akka . scala (2.11) Akka , " scala " .
, / ( /). , , ):
import scala.concurrent.duration._
import scala.collection.immutable.Set
class Supervisor extends Actor {
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: ArithmeticException => Resume
case _: NullPointerException => Restart
case _: IllegalArgumentException => Stop
case _: Exception => Escalate
}
val worker = context.actorOf(Props[Worker])
var pendingRequests = Set.empty[WorkerRequest]
def receive = {
case req: WorkRequest(sender, jobReq) =>
pendingRequests = pendingRequests + req
worker ! req
system.scheduler.scheduleOnce(10 seconds, self, WorkTimeout(req))
case resp: WorkResponse(req @ WorkRequest(sender, jobReq), jobResp) =>
pendingRequests = pendingRequests - req
sender ! resp
case timeout: WorkTimeout(req) =>
if (pendingRequests get req != None) {
worker restart
pendingRequests foreach{ worker ! _ }
}
}
}
: . // , . , , " " - O/S- , .