2016-02-23 15 views
7

एक साधारण सवाल होना चाहिए। मैं अक्का 2.4.2 का उपयोग कर रहा हूं (इसमें अक्का स्ट्रीम & HTTP शामिल है)। मुझे यह Source & को समाप्त करने के लिए प्रोग्राम को समाप्त करने की उम्मीद है क्योंकि Source सीमित है, लेकिन यह कभी नहीं करता है। यह कार्यक्रम क्यों समाप्त नहीं होता है?यह सरल अक्का स्ट्रीम प्रोग्राम क्यों समाप्त नहीं होता है?

import scala.concurrent._ 
import scala.collection.immutable._ 
import akka._ 
import akka.actor._ 
import akka.stream._ 
import akka.stream.scaladsl._ 
import akka.util._ 

object Test extends App { 

    implicit val system = ActorSystem("TestSystem") 
    implicit val materializer = ActorMaterializer() 

    val s = Source.single(1) 
    s.runForeach(println) 
} 

आउटपुट:

$ sbt run 
... 
[info] Running Test 
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] logger log1-Logging$DefaultLogger started 
[DEBUG] [02/23/2016 10:59:19.904] [run-main-0] [EventStream(akka://TestSystem)] Default Loggers started 
1 
मेरी build.sbt फ़ाइल के

प्रासंगिक भाग:

scalaVersion := "2.11.7" 

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8") 

libraryDependencies ++= { 
    val akkaVersion = "2.4.2" 
    Seq(
    "com.typesafe.akka" %% "akka-stream" % akkaVersion 
) 
} 

उत्तर

9

क्योंकि अक्का non-daemonic threads का उपयोग करता है, तो यह एप्लिकेशन जब तक आप बंद डाउन ActorSystem प्रदर्शन जारी रहे। इसका कारण यह है कि ठेठ उपयोग का मामला बस अपनी मुख्य विधि में सिस्टम को शुरू करना है और फिर सभी गणना उस थ्रेड पर होती है जो अभिनेता सिस्टम प्रबंधित करता है (यानी main() थ्रेड को पूरा करने और दूर जाने के लिए छोड़ दिया जाता है - अगर धागे डिमनिक होंगे तो ऐप बंद हो जाएगा नीचे, जो हम आमतौर पर नहीं चाहते हैं)।

import system.dispatcher 
s.runForeach(println).onComplete { _ => system.terminate() } 
:

आप के माध्यम से ऐसा कर सकते हैं

0

https://groups.google.com/d/msg/akka-user/u3MXlfVpm40/LHyYruS0HgAJhttps://stackoverflow.com/users/111024/konrad-ktoso-malawski द्वारा पर उत्तर दिया, यहाँ सुविधा के लिए कॉपी; उन्हें श्रेय:

क्योंकि अक्का गैर-डिमनिक धागे का उपयोग करता है, इसलिए जब तक आप अभिनेता सिस्टम को बंद नहीं करते हैं तब तक ऐप चालू रहेगा।

आप के माध्यम से ऐसा कर सकते हैं:

import system.dispatcher 
s.runForeach(println).onComplete { _ => system.terminate() } 
संबंधित मुद्दे