2016-05-17 14 views
1

ターミナルで^ cを押すまで、シェルのフォアグラウンドで実行される2つのコマンドを実行するプログラムを作成しました。Executorサービスは最初のタスクのみを実行します

それぞれシェルコマンド

./weed master -mdir=/var/lib/qualebs/weed 

次のように上記のコマンドの出力は

[email protected]:~$ cd weed_0.64_linux_386/ 
[email protected]:~/weed_0.64_linux_386$ ./weed master -mdir=/var/lib/qualebs/weed -port=9333 
I0518 00:40:16 24540 file_util.go:19] Folder /var/lib/qualebs/weed Permission: -rwxr-xr-x 
I0518 00:40:16 24540 topology.go:84] Using default configurations. 
I0518 00:40:16 24540 master_server.go:56] Volume Size Limit is 30000 MB 
I0518 00:40:16 24540 master.go:66] Start Seaweed Master 0.64 at :9333 
I0518 00:40:16 24540 raft_server.go:97] Recovered from log 
I0518 00:40:22 24540 master_server.go:82] [ localhost:9333 ] localhost:9333 becomes leader. 

次いでIコマンドと出力とボリュームサーバを起動さ

[email protected]:~$ cd weed_0.64_linux_386/ 
[email protected]:~/weed_0.64_linux_386$ ./weed volume -dir=/var/lib/qualebs/weed -port=9444 
I0518 00:42:18 24583 file_util.go:19] Folder /var/lib/qualebs/weed Permission: -rwxr-xr-x 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/1.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/1.dat, replicaPlacement=000 v=2 size=2021448 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/2.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/2.dat, replicaPlacement=000 v=2 size=728808 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/3.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/3.dat, replicaPlacement=000 v=2 size=1215160 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/4.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/4.dat, replicaPlacement=000 v=2 size=1272992 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/5.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/5.dat, replicaPlacement=000 v=2 size=404944 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/6.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/6.dat, replicaPlacement=000 v=2 size=834640 ttl= 
I0518 00:42:18 24583 volume.go:103] loading file /var/lib/qualebs/weed/7.idx readonly false 
I0518 00:42:18 24583 store.go:212] data file /var/lib/qualebs/weed/7.dat, replicaPlacement=000 v=2 size=588240 ttl= 
I0518 00:42:18 24583 store.go:219] Store started on dir: /var/lib/qualebs/weed with 7 volumes max 7 
I0518 00:42:18 24583 volume.go:90] Start Seaweed volume server 0.64 at 0.0.0.0:9444 

Javaコードを自動的にマスターとボリュームサーバーを起動する

public class ContextListener implements ServletContextListener { 

    private final ExecutorService executor = Executors.newFixedThreadPool(2); 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     final ServletContext servletContext = sce.getServletContext(); 
     executor.execute(new WeedMaster()); 
     executor.execute(new WeedVolume()); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     executor.shutdown(); 
     try { 
      executor.awaitTermination(0, TimeUnit.SECONDS); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(ContextListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private class WeedMaster implements Runnable { 

     @Override 
     public void run() { 
      try { 
       List<String> command = new ArrayList<>(); 
       command.add("./weed"); 
       command.add("master"); 
       command.add("-mdir=/var/lib/qualebs/weed"); 
       command.add("port=9333"); 
       ProcessBuilder pb = new ProcessBuilder(command); 
       pb.directory(new File("/home/qualebs/weed_0.64_linux_386/")); 
       Process start = pb.start(); 
       start.waitFor(); 
      } catch (IOException | InterruptedException ex) { 
       Logger.getLogger(ContextListener.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

    } 

    private class WeedVolume implements Runnable { 

     @Override 
     public void run() { 
      try { 
       List<String> command = new ArrayList<>(); 
       command.add("./weed"); 
       command.add("volume"); 
       command.add("-dir=/var/lib/qualebs/weed"); 
       command.add("port=9444"); 
       ProcessBuilder pb = new ProcessBuilder(command); 
       pb.directory(new File("/home/qualebs/weed_0.64_linux_386/")); 
       Process start = pb.start(); 
       start.waitFor(); 
      } catch (IOException | InterruptedException ex) { 
       Logger.getLogger(ContextListener.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

    } 
} 

次に、アプリケーションをサーバーにデプロイすると、最初のコマンドが実行され、マスターサーバーが実行されていてボリュームサーバーは実行されていないことがわかります。なぜ2番目のタスクは実行されませんか?

両方のコマンドを端末から実行されたとき、私は主人とボリュームの両方が

[email protected]:~$ sudo ps auwx | grep weed 
[sudo] password for qualebs: 
qualebs 24540 0.0 0.1 798100 7008 pts/1 Sl+ 00:40 0:00 ./weed master -mdir=/var/lib/qualebs/weed -port=9333 
qualebs 24583 0.0 0.1 798100 9124 pts/6 Sl+ 00:42 0:00 ./weed volume -dir=/var/lib/qualebs/weed -port=9444 
qualebs 24749 0.0 0.0 22516 1020 pts/18 S+ 00:48 0:00 grep --color=auto weed 

を実行している見ることができますが、プロセスビルダーから実行したとき、私は唯一のポート9333

+0

は、両方のタスクが全く走ったそのうちの一つが何らかの理由 – Antoniossss

+0

のため終了didntの場合、私は私の '」(command.addポートに間違いを見ている場合は'を参照して)各 'start.waitFor(後にログを追加します。 = 9333 ");ポートの前に' '私は忘れました。 'command.add(" - port = 9333 ");'に変更され、すべて正常に機能しました。私は誤ったアラームのためにとても残念です。 – qualebs

答えて

1

いけない用途にリスニング習得している:

executor.execute(new WeedMaster()); 
    executor.execute(new WeedVolume()); 

あなたはinsteed使用する必要があります。

executor.submit(new WeedMaster()); 
    executor.submit(new WeedVolume()); 

ドキュメントによれば、executor.execute(Runnable)は、実装の裁量で現在の(呼び出し中の)スレッドでrunnableを呼び出すことができます。引用:

ボイド(Runnableをコマンド)を実行

は、将来のある時点で指定されたコマンドを実行します。コマンドは、 が、新しいスレッド、プールされたスレッド、または呼び出し側スレッド でExecutor実装の裁量で実行されます。

+0

既にそれを試しましたが、悲しいことに違いはありません。 – qualebs

関連する問題