0

多数のユーザー (~3000 ユーザー) を同時にサポートする Web アプリケーションでスレッド プールを使用したいと考えています。スレッド プールを使用して実行している別のスレッドで Web サービスを呼び出しています。Web サービスが応答を送信できない場合は常に、スレッドが停止します。そのため、150 ミリ秒後にスレッドを停止/タイムアウトしたいと考えています。これは私が今していることです:

カスタム スレッド:

public class RetrieveDocTask implements Runnable {
public void run() {
    //gather variables
    //invoke webservice
}}

スレッドを実行するフィルター:

public class DocFilter implements Filter {
private static ExecutorService executor = Executors.newCachedThreadPool();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    RetrieveDocTask task=new RetrieveDocTask();
    executor.execute(task);
}}

インターネットで解決策を探しましたが、どれもうまくいきませんでした。Future と callable を使用すると言う人もいれば、ThreadPoolExecutor を作成してタイムアウトを指定するように頼む人もいました。なぜ機能しなかったのかわかりません。また、多数のユーザーにキャッシュされたプール エグゼキューターを使用しても問題ありません。私はこれに慣れていないので、できるだけ早く実装する必要があります。

4

1 に答える 1

0

確かに、ここで必要なのは未来です。クラス RetrivDoc が実際に文字列を返すとします。

 private static final class RetrieveDoc implements Callable<String>{
      @Override
      public String call() throws Exception {
          //do some computation and retirieve doc
          return "DocAsString";
      }
 }


 ExecutorService service = Executors.newFixedThreadPool(1);
 Future<String> futureResponse = service.submit(new RetrieveDoc());
 //this will blokc for only 150 milliseconds
 String response = null;
 try{
      response = futureResponse.get(150, TimeUnit.MILLISECONDS);
 } catch(TimeoutException e){
     System.out.println("TimeoutException happended");
 }

 if(response == null){
      //do something
 }
于 2013-04-29T09:15:58.703 に答える