使用Executor框架在Weblogic SOAP Webservice中创建后台线程

时间:2015-10-21 13:09:24

标签: java multithreading java-ee

我们在Weblogic服务器上部署了一个SOAP Web服务,其流程如下所示。

  

SOAP客户端将向Webservice发送消息,该消息验证消息并发送确认作为服务的响应。但是,假设在后台执行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));
    }

通过上述实现,Scalability绝对是一个问题,但我们现在可以忍受它。你能帮助解决以下问题吗

  1. 由于后台线程长寿,这意味着将使用相同的衍生线程来执行所有请求吗?
  2. 如果两个请求以几秒钟的间隔进入,第二个请求是否会处于等待状态或者会产生新的线程?
  3. 我们没有关闭遗嘱执行人,那么在这种情况下会遇到什么问题呢?

2 个答案:

答案 0 :(得分:1)

  1. 对于每个请求,您将创建一个仅执行该请求的新线程。
  2. 相同。
  3. 很快就会遇到OutOfMemoryError - 创建并且没有关闭执行程序会占用所有内存。
  4. 我的建议不是为每个请求创建新的执行程序,而是重用相同的执行程序。让那个执行器包含几个线程。不是一个。

答案 1 :(得分:0)

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

  

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

首先,创建一个ThreadPool来提供平均并行线程。

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中的代码 - &gt; contextDestroyed()函数

ImplClass.executorService.shutdown();

如果有任何异常,我们会处理相同的问题并执行shutdownNow()