Author: jbonofre
Date: Mon Aug 12 04:14:00 2013
New Revision: 1513038

URL: http://svn.apache.org/r1513038
Log:
[KARAF-2437] Refactoring of log:tail to use a executor service and properly 
control the thread

Modified:
    
karaf/branches/karaf-2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java

Modified: 
karaf/branches/karaf-2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
URL: 
http://svn.apache.org/viewvc/karaf/branches/karaf-2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java?rev=1513038&r1=1513037&r2=1513038&view=diff
==============================================================================
--- 
karaf/branches/karaf-2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
 (original)
+++ 
karaf/branches/karaf-2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
 Mon Aug 12 04:14:00 2013
@@ -18,6 +18,8 @@ package org.apache.karaf.shell.log;
 
 import java.io.PrintStream;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 
 import org.apache.felix.gogo.commands.Command;
@@ -28,24 +30,29 @@ import org.ops4j.pax.logging.spi.PaxLogg
 
 @Command(scope = "log", name = "tail", description = "Continuously display log 
entries. Use ctrl-c to quit this command")
 public class LogTail extends DisplayLog {
-    
-    private boolean needEndLog;
+
+    private ExecutorService executorService = 
Executors.newSingleThreadExecutor();
 
     protected Object doExecute() throws Exception {
-        new Thread(new PrintEventThread()).start();
-        
+        PrintEventThread thread = new PrintEventThread();
+        executorService.execute(thread);
+
         for (;;) {
             int c = session.getKeyboard().read();
             if (c < 0) {
-                needEndLog = true;
+                thread.abort();
                 break;
             }
-
         }
+
+        executorService.shutdownNow();
         return null;
     }
     
     class PrintEventThread implements Runnable {
+
+        boolean doDisplay = true;
+
         public void run() {
             final PatternConverter cnv = new PatternParser(overridenPattern != 
null ? overridenPattern : pattern).parse();
             final PrintStream out = System.out;
@@ -63,7 +70,7 @@ public class LogTail extends DisplayLog 
             };
             try {
                 events.addAppender(appender);
-                while (!needEndLog)  {
+                if (doDisplay) {
                     PaxLoggingEvent logEvent = queue.take();
                     if (logEvent != null) {
                         display(cnv, logEvent, out);
@@ -76,6 +83,11 @@ public class LogTail extends DisplayLog 
             }
             out.println();
         }
+
+        public void abort() {
+            doDisplay = false;
+        }
+
     }
 
 }


Reply via email to