2015-10-21 64 views
2

我們在Weblogic服務器上部署了一個SOAP webservice,流程如下。使用Executor框架在Weblogic SOAP Webservice中創建後臺線程

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)); 
    } 

對於上述實現可伸縮性絕對是一個問題,但我們可以像現在一樣適應它。你可以幫助下面的查詢雖然

  1. 由於後臺線程很長生活是否意味着相同的衍生線程將用於執行所有請求?
  2. 如果兩個請求以幾秒鐘的時間間隔進入,第二個請求是處於等待狀態還是會產生新線程?
  3. 我們並沒有關閉執行者,那麼在這種情況下遇到的問題是什麼?

回答

1
  1. 對於每個請求,都會創建一個只執行該請求的新線程。
  2. 相同。
  3. 很快你會遇到一個OutOfMemoryError - 創建並沒有關閉的執行程序吃掉所有的內存。

我的建議並不是爲每個請求創建新的執行器,而是重用相同的執行器。讓那個執行器包含幾個線程。不是一個。

+0

感謝您的輸入。基於上面的第三點,我計劃擁有一個固定線程池的最終ExecuteService對象,如下所示。 「私有靜態最後的ExecutorService EXECUTESERVICE = Executors.newFixedThreadPool(3); '這會好嗎?另外我讀的Executor線程不關機服務器停止?如何以編程方式終止這些線程?此代碼位於我的Web服務實現文件中。 – Saurav

+0

到shouldown執行線程的服務器停止,讓他們守護線程,如http://stackoverflow.com/questions/1516172/executor-and-daemon-in-java/1517264#1517264 –

0

這是我爲上述問題設計的方法。

可有人請驗證,並確認是否仍然可以引起任何 內存或線程問題。

首先,創建一個ThreadPool來爲平均並行線程提供服務。

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

接着,調用相應的實例的MessageProcessor了該消息類型103或104

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

最後,執行的ExecutorService的關閉,如果web服務上下文破壞。爲此,將在web.xml中配置一個監聽器。

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

代碼內AppContextListener - > contextDestroyed()函數

ImplClass.executorService.shutdown(); 

在任何異常的情況下將處理相同,並做了shutdownNow()

+0

任何人都可以請驗證上面的幫助做法。提前致謝。 – Saurav

相關問題