【问题标题】:RejectedExecutionException on submit worker提交工作人员的 RejectedExecutionException
【发布时间】:2013-12-19 14:57:09
【问题描述】:

我开始遇到部署在 weblogic 10.3.4 中的 web 服务的问题。在这个 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();
}

第一次使用,成功处理命令。但是,当我再次调用时,我开始收到 java.util.concurrent.RejectedExecutionException,指向我写 executor.submit(worker) 时的行。

堆栈跟踪:

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

【问题讨论】:

    标签: java multithreading exception submit


    【解决方案1】:

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

    【讨论】:

    • 谢谢! executor.shutdown() 是问题所在。我删除了 finally 块,一切正常。
    猜你喜欢
    • 2018-02-15
    • 2015-07-10
    • 2021-01-11
    • 2018-11-05
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多