我们在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绝对是一个问题,但我们现在可以忍受它。你能帮助解决以下问题吗
答案 0 :(得分:1)
我的建议不是为每个请求创建新的执行程序,而是重用相同的执行程序。让那个执行器包含几个线程。不是一个。
答案 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()