0

我想在 Web 应用程序中使用线程池,它应该同时支持大量用户(约 3000 个用户)。我正在使用线程池执行的单独线程中调用 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

的确,未来是您在这里所需要的。假设您的类 RetriveDoc 实际上返回一个字符串。

 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 回答