2016-03-31 12 views
1

bir Spawned Sürecinin InputStream denetleyin ben Programı Java’da yazmıyor aslında. Bunu Clojure'de yazıyorum ama henüz yapmadığım bir Clojure yaklaşımı bulamadım. Bu yüzden Clojure tarafından sarılmış Java yerel API'sini kullanmaya çalışıyorum.aşağıdaki bash komut yumurtlamaya ve uyumsuz onun stdout'u yakalamak için çalışıyorum


bir nodejs örnek

Tho biraz daha niyetimi netleştirmek, burada tam olarak yapar node.js için bir JavaScript kodu, istediğim bu:

const spawn = require('child_process').spawn; 
const sleeper = spawn('sleeper'); 

sleeper.stdout.on('data', (data) => { 
    if (data.toString() === "two\n") { 
     doSomeAction(); 
    } 
}); 
+0

Giriş akışı işleminin ayrı bir iş parçacığında yapılmasını ve başka bir iş parçacığı tarafından denetlenmesini istiyor musunuz? Ya da sadece belirli bir veri veya süreç sona erene kadar süreci ele almalı mı? –

+0

Hayır, bunu yargılayabildiğim kadarıyla, ayrı bir iş parçacığı gerekli değildir. Alt işlem ("uyuyan"), ağır bir bilgi işlem uygulaması değildir. Aslında küçük bir sunucu çalıştıran bir unix aracı, bu yüzden gerçekten sonsuz çalışır. Bununla birlikte, başvurum için önemli olan, alt süreci denetlerken engellenmemesidir. Diğer her şey devam etmeli ... –

cevap

2

yapabilirsiniz araçları, basit Java interop ile birlikte clojure.java.io'da kullanın.

(require '[clojure.java.io :refer [reader]]) 

(let [process (.start (ProcessBuilder. ["./sleeper"]))] 
    (with-open [r (reader (.getInputStream process))] 
    (doseq [line (line-seq r)] 
     (when (= line "two") 
     (println line))))) 

senin repl yapıştırın ve uygun bir gecikmeden sonra two olmanın çıktı görmelisiniz:

Burada başlamanıza yardımcı olacak bazı kod.

+1

Ayrıca bir 'geleceğin' içine de sarılabilirsin, böylece ana uygulama parçan engellenmez ve çalışmaya devam edebilir. –

+0

@PiotrekBzdyl Right. - Sadece sorunun ana parçayı engellemeyen bir çözüm istediğini fark ettim. Programın ana iş parçasında ne yaptığını bilmeden cevaplayamayacağımı hissediyorum… iyi şanslar! – glts

+0

güzel! Bu tam olarak ne gerekiyorsa yapsın .. –