当前位置: 首页 > 知识库问答 >
问题:

执行器服务线程

左翰海
2023-03-14

我有一个REST Webservices通过socket调用从遗留系统获得结果来处理它的请求。

因为有4个套接字可用,所以我设置了一个ExecutorService,其中没有4个线程来排队等待这样的连接。服务最初运行正常,但过了一段时间后性能开始下降;我使用jconsole并发现它正在创建>3000个线程,最后以以下错误结束:

SEVERE: Servlet.service() for servlet [jersey-serlvet] in context with
path [/DCardServices] threw exception [java.lang.OutOfMemoryError:
unable to create new native thread] with root cause
java.lang.OutOfMemoryError: unable to create new native thread
    null
ExecutorService spool = Executors.newFixedThreadPool(Integer.valueOf(GlobalUtils.getAppProp().getString("socketPoolSize")).intValue());  
ExecutorService executorService = Executors.newFixedThreadPool(4);

public Response queforTdmProcess(JSSigData jsData) {
    return sndWSResponse(jsData.processCardResp1(executorService.submit(new TdmSocketRequest(jsData,socketQueue, spool)).get()));
}

public class TdmSocketRequest implements Callable<String>  {
    Socket s = getSocketFromPool();
    /* connection to socket and get data */
    retSocketToPool(s);
}


public Socket getSocketFromPool() {
    try {
        conSocketConsumer sckconsumer = new conSocketConsumer(getSocketQueue());
        Future<Socket> future = getSpool().submit(sckconsumer); 
        Socket s = future.get();
        System.out.print("Getting socket " +  s.getLocalPort() + " from the pool"  + "\n");

            return s;
        } catch (Exception e) {
            // TODO: handle exception
        }
        return null;
    }

public void retSocketToPool(Socket s) {
        conSocketProducer sckProducer = new conSocketProducer(getSocketQueue(),s);
        System.out.print("Returning socket " +  s.getLocalPort() + " to the pool" + "\n" );
        getSpool().submit(sckProducer);
    }
}

非常感谢您的任何建议和帮助!

共有1个答案

连文栋
2023-03-14

executors.newfixedthreadpool(integer.valueof(globalutils.getappprop().getstring(“socketpoolsize”)).intvalue());

这一行使JVM创建integer.valueOf(globalutils.getAppprop().getString(“socketpoolsize”).intvalue()线程。套接字池往往表示它可以创建的连接数量,通常在2000-3000之间。您不应该创建这种大小的线程池。

查看代码的其余部分,我不完全确定您试图用这个池做什么。您在新线程中创建套接字,但随后阻止在原始线程上检索这些套接字。我建议您删除所有添加的线程,因为目前它除了添加更多的线程之外什么也不做。

最后,在使用异步处理时,使用future.get()几乎总是一个坏主意,因为这会抵消多线程的任何好处。必须使用它表明您需要重新考虑您的设计

 类似资料:
  • 这种方法的Java博士说 如果需要,最多等待给定的时间完成计算,然后检索其结果(如果可用)。 参数: 超时等待的最长时间 unit超时参数的时间单位 根据我的理解,我们对强加了一个超时,我们提交给,这样,我的将在指定的时间(超时)过去后中断 但是根据下面的代码,似乎超过了超时时间(2秒),我真的很难理解这一点。谁能给我指一下正确的路吗?

  • 我有一个数据库结果,每一个调用创建500条记录500条,然后下一个500条,然后下一个 我需要运行一个记录每个不同线程执行特定任务的程序 我举的例子如下 ExecutorService executor=Executors.newFixedThreadPool(10); 我的问题是,在完成当前executer服务之前,it需要获得接下来的500个用户并尝试开始处理,我需要停止该操作,直到处理了前5

  • 然后是数据报通道、pipelineFactory和Bootstrap: 在pipelineFactory中,getPipeline()添加自定义处理程序。 就像中所说的:UDP消息的多线程处理 然后我根据这些条目修改了一些代码。现在创建线程池的条件是: 和ExecutionHandler的pipelineFactory: getPipeline()添加处理程序,如所描述的: 但它们不同时处理。me

  • “Drools骆驼服务器”和“KIE-WB执行服务器”有什么区别?它们是否服务于在远程服务器中执行规则/进程的相同目的?

  • 我已经安装了MySQL 5.5。34,Apache2.2。15和PHP5.5。4在我的linux Redhat系统(2.6.32-220.17.1.el6.x86_64)上按各自的顺序排列。 当php脚本在web浏览器上运行时,它被apache解释为html,尽管它在命令行中运行良好。 我在httpd.conf文件中做了以下更改:我有未注释的LoadMoulesphp5_module模块/libp

  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • 目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。 下面是一个小视图:主线程调用t0、t1、t2、t3,t0调用t4、t5。其他线程也可以调用其他线程。 问题是shutdown()和awaitTermination()在t0、t1、t2、t3时被调用并完成,而没有等待t4和t5。因此,当t4和

  • 我们目前正在将jBPM(7.37.final)规则部署到一个Kie执行服务器,并使用执行服务器自动公开的REST API调用规则。 但是由于一些体系结构的限制,我们不能使用REST API调用规则。该选项是执行一个基于jar(kie服务器客户机或其他)的集成,并从客户机(java应用程序)远程调用执行服务器上的规则。 Virges Vinay