2016-10-11 5 views
0

DropwizardのLifecycleEnvironment.scheduledExecutorService()でScheduledExecutorServiceを作成しています。私は4つのタスクをスケジュールしていますが、3秒後に例外がスローされます。問題は、スタックトレースが例外に対して出力されないため、なぜそれが起こったのかを追跡することができないということです。例外1をスローするタスクは決して再開されません。ScheduledExecutorServiceのタスクが例外をスローしたときにスタックトレースが出力されない

私はデフォルトのキャッチされない例外ハンドラを設定しようとしたが、それは助けていないかでした後

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable throwable) { 
       System.err.println("An exception occurred as below:"); 
       throwable.printStackTrace(System.err); 
      } 
     }); 

を完全なコードです:

これは、アプリケーションを拡張する主駆動クラスです:

App.java

import io.dropwizard.Application; 
import io.dropwizard.setup.Environment; 

import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

public class App extends Application<AppConfiguration> { 

    public void run(AppConfiguration appConfiguration, Environment environment) throws Exception { 
     final ScheduledExecutorService scheduledExecutorService = environment.lifecycle() 
       .scheduledExecutorService("throwing-exception-threads").threads(4) 
       .build(); 

     scheduledExecutorService.scheduleAtFixedRate(new ThreadToDie(), 0,5, TimeUnit.SECONDS); 
     scheduledExecutorService.scheduleAtFixedRate(new ThreadToDie(), 0,5, TimeUnit.SECONDS); 
     scheduledExecutorService.scheduleAtFixedRate(new ThreadToDie(), 0,5, TimeUnit.SECONDS); 
     scheduledExecutorService.scheduleAtFixedRate(new ThreadToDie(), 0,5, TimeUnit.SECONDS); 

     final HelloWorldResource resource = new HelloWorldResource(); 
     environment.jersey().register(resource); 
    } 

    public static void main(String[] args) throws Exception { 
     new App().run(args); 
    } 
} 

コードタスクであるために一定の間隔で予定されています。 1秒ごとにインクリメントされるカウンタ値を出力します。カウンタが3の場合、NullPointerExceptionがスローされます。以下の完全を期すために

public class ThreadToDie implements Runnable { 

    int i = 0; 

    @Override 
    public void run() { 
     i++; 
     System.out.printf("Value of i: %d\n", i); 
     if (i % 3 == 0) { 
      System.out.printf("Throwing NullPointerException\n"); 
      throw new NullPointerException("This should be printed."); 
     } 
    } 
} 

ThreadToDie.javaは、ConfigurationクラスとのHelloWorld APIクラスです。彼らが何を含んでいるのかという質問には関係はありません。

AppConfiguration.java

import io.dropwizard.Configuration; 

public class AppConfiguration extends Configuration { 
} 

HelloWorldResource.java

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.MediaType; 
import java.util.Optional; 

@Path("/hello") 
@Produces(MediaType.APPLICATION_JSON) 
public class HelloWorldResource { 

    @GET 
    public String hello(@QueryParam("name") Optional<String> name) { 
     final String retVal = String.format("Hello %s!", name.orElse("World")); 
     return retVal; 
    } 
} 

答えて

1

UncaughtExceptionHandlerがトリガされることはありません理由について説明をWhy is UncaughtExceptionHandler not called by ExecutorService?を参照してください - あなたが提供する各タスクは、すべての例外をキャッチし、作業者によって処理されます。タスクが完了またはエラー状態まで、

ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(new ThreadToDie(), 0,5, TimeUnit.SECONDS); 
try { 
    future.get(); 
} catch (ExecutionException ex) { 
    ex.getCause().printStackTrace(); 
} 

Future.getは待機します:あなたはFutureをバック受け取り、その方法で例外にアクセスすることができますエグゼキュータにタスクを送信

+0

ありがとうございました。 – Xolve

関連する問題