【问题标题】:Background thread creation in Weblogic SOAP Webservice using Executor framework使用 Executor 框架在 Weblogic SOAP Webservice 中创建后台线程
【发布时间】:2015-10-21 13:09:24
【问题描述】:

我们在 Weblogic 服务器上部署了一个 SOAP 网络服务,流程如下。

SOAP 客户端将向 Web 服务发送消息,Web 服务验证该消息并发送一个确认作为服务的响应。但是,假设在后台执行 SocketConnection 以进一步异步处理消息。

已经提供的实现是使用ExecutorService.newFixedThreadPool 在后台生成一个ChildThread。这是正在使用的代码(并非所有 webservice 实现文件的代码都在此处发布)。

  if ("103".equals(requestType)) {
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.submit(new MessageProcessing103(coreMsg, otherDetails));
  } else if ("104".requestType) {
         ExecutorService executorService = Executors.newFixedThreadPool(1);
         executorService.submit(new MessageProcessing104(coreMsg, otherDetails));
    }

通过上述实现,可伸缩性绝对是一个问题,但我们现在可以接受它。你能帮忙解决以下问题吗

  1. 由于后台线程长期存在,这是否意味着将使用同一个衍生线程来执行所有请求?
  2. 如果在几秒内有两个请求进入,第二个请求是处于等待状态还是会产生新线程?
  3. 我们不会关闭执行器,那么在这种情况下会遇到什么问题?

【问题讨论】:

    标签: java multithreading jakarta-ee


    【解决方案1】:
    1. 对于每个请求,您创建一个只执行该请求的新线程。
    2. 一样。
    3. 很快您就会遇到 OutOfMemoryError - 创建但未关闭的执行程序会占用所有内存。

    我的建议是不要为每个请求创建新的执行器,而是重用同一个执行器。并让该执行程序包含多个线程。一个都没有。

    【讨论】:

    • 感谢您的意见。基于上面的第三点,我计划有一个带有固定线程池的最终 ExecuteService 对象,如下所示。 'private static final ExecutorService EXECUTESERVICE = Executors.newFixedThreadPool(3); '这是否足够好。我还阅读了 Executor 线程在服务器停止时不会关闭?如何以编程方式终止这些线程?此代码在我的 Web 服务实现文件中。
    • 在服务器停止时应该拥有执行线程,使它们成为守护线程,如stackoverflow.com/questions/1516172/executor-and-daemon-in-java/…
    【解决方案2】:

    这是我为上述问题设计的方法。

    请有人验证并确认这是否仍然会导致任何 内存不足或线程问题。

    首先,创建一个线程池来服务平均并行线程。

    public static final ExecutorService executorService = Executors.newFixedThreadPool(3);
    

    接下来,为消息类型 103 或 104 调用相应的 MessageProcessor 实例

      if ("103".equals(requestType)) {
           executorService.submit(new MessageProcessing103(coreMsg, otherDetails));
      } else if ("104".requestType) {
           executorService.submit(new MessageProcessing104(coreMsg, otherDetails));
        }
    

    最后,如果 Webservice Context 销毁,则关闭 executorService。为此将在 web.xml 中配置一个监听器。

     <listener>
    <listener-class>com.saurav.listener.AppContextListener</listener-class></listener>
    

    AppContextListener 内的代码 --> contextDestroyed() 函数

    ImplClass.executorService.shutdown();
    

    如果出现任何异常,将进行相同处理并执行shutdownNow()

    【讨论】:

    • 谁能帮忙验证上述方法。提前致谢。
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多