RejectedExecutionException对提交工作者

时间:2013-12-03 13:54:58

标签: java multithreading exception submit

我开始遇到weblogic 10.3.4中部署的webservice的问题。在这个Web服务中,我创建了一个新的Callable类来处理命令:

public class CommandById implements Callable<DataBean> {
   private String docId = null;
   private String folder = null;

   public CommandById(final String docId, final String folder) {
      this.docId = docId;
      this.folder = folder;
   }

   @Override
   public DataBean call() throws Exception {
      // Do something with docId and folder
   }
}

所以,我以这种方式在另一个类中使用这个类:

ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);
Callable<DataBean> worker = new CommandById(docId,folder);
Future<DataBean> submit = executor.submit(worker);
DataBean doc = null;
try {
   doc = submit.get();
} catch (InterruptedException e) {
   e.printStackTrace();
} catch (ExecutionException e) {
   e.printStackTrace();
} finally {
   executor.shutdown();
}

第一次使用,process命令成功。但是,当我再次打电话时,我开始学习java.util.concurrent.RejectedExecutionException,当我写executor.submit(worker)时指向该行。

stacktrace:

Error: [ServletContext@1747534847[app:BancoChile-Url module:reports path:/reports spec-version:2.5]] Servlet failed with Exception
cl.xxx.yyy.Exception: java.util.concurrent.RejectedExecutionException
        at cl.xxx.yyy.servlet.Worker.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
Caused by: java.util.concurrent.RejectedExecutionException
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1774)
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:92)
        at cl.xxx.yyy.zzz.aaa.getDocument(aaa.java:252)
        at cl.xxx.yyy.bbb.processId(bbb.java:941)
        at cl.xxx.yyy.zzz.getResultsById(zzz.java:692)
        at cl.xxx.yyy.zzz.getResults(zzz.java:384)
        ... 16 more

1 个答案:

答案 0 :(得分:0)

缺少一些东西。 如果超过允许的最大线程数(RejectedExecutionException多少),您可以获得NTHREADS?或者在线程池处于关闭过程中。 你总是使用相同的线程池吗?如果是这样,你的finally块中的executor.shutdown()可以解释这一点。