2011-05-31 68 views
1

我有一個Web服務暴露與Spring和JAX-WS。我使用jax-ws commons來做到這一點(http://jax-ws-commons.java.net/spring/)。應用程序部署在weblogic 10.3上,有時一些線程似乎被阻塞。上次我得到一個線程轉儲時,我看到6個線程被標記爲「STUCK」,並且這些線程正在佔用%100個CPU。線程的痕跡如下:JAX-WS線程消耗%100 CPU

 "[STUCK] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00002aaaec5f8800 nid=0x3d99 run 
nable [0x0000000048ca4000] 
    java.lang.Thread.State: RUNNABLE 
     at java.util.HashMap.put(HashMap.java:374) 
     at java.util.HashSet.add(HashSet.java:200) 
     at weblogic.wsee.jaxws.ServerLateInitTube.initializeCopy(ServerLateInitTube.java:56) 
     at weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:45) 
     at weblogic.wsee.jaxws.ServerLateInitTube.copy(ServerLateInitTube.java:24) 
     at com.sun.xml.ws.api.pipe.TubeCloner.copy(TubeCloner.java:102) 
     at com.sun.xml.ws.api.pipe.TubeCloner.clone(TubeCloner.java:74) 
     at com.sun.xml.ws.server.WSEndpointImpl$2.<init>(WSEndpointImpl.java:251) 
     at com.sun.xml.ws.server.WSEndpointImpl.createPipeHead(WSEndpointImpl.java:250) 
     at com.sun.xml.ws.api.server.Adapter$Toolkit.<init>(Adapter.java:108) 
     at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.<init>(HttpAdapter.java:434) 
     at com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:203) 
     at com.sun.xml.ws.transport.http.HttpAdapter.createToolkit(HttpAdapter.java:99) 
     at com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:117) 
     at com.sun.xml.ws.api.server.Adapter$1.create(Adapter.java:115) 
     at com.sun.xml.ws.util.Pool.take(Pool.java:78) 
     at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:248) 
     at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140) 
     at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129) 
     at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160) 
     at com.sun.xml.ws.transport.http.servlet.WSSpringServlet.doPost(WSSpringServlet.java:52) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
     at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
     at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 
     at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) 
     at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3594) 
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
     at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
     at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202) 
     at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108) 
     at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432) 
     at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
     at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 

你有什麼想法,爲什麼有stucked線程?

回答

0

我向Oracle打開了一個SR,他們爲這個問題發送了一個補丁。問題似乎與補丁修復。

+0

你有沒有參考這個問題在哪裏/如何/釋放?一些發行說明提到了10.3.1中不同主題領域的類似問題,但我們在10.3.3中遇到了這個問題。 – 2011-12-05 00:56:23

+0

我不確定這個補丁是否與最新的最新版本一起發佈,它是專門爲我們製作的。 – 2011-12-05 06:47:22

+0

好 - 謝謝:-) – 2012-01-08 07:19:11

1

你很可能在你的代碼中有一個非終止循環,導致這種情況發生。

可以在調試器下運行,並在出現症狀時暫停程序以調查每個線程的當前狀態,或者使用JDK中的JVisualVM附加到正在運行的程序並獲取線程轉儲。

基於這些知識,您可以決定瓶頸的位置,然後推斷如何解決該問題。

+0

如果我沒有記錯的話,就會出現此問題之前,* *我的代碼運行。此外,我從線程轉儲中捕獲上面的跟蹤。 – 2011-06-01 11:57:46

+0

這看起來像是爲Web服務創建的EndPoint無限循環。你如何配置這些? – 2011-06-01 17:19:12

+0

這是我在spring配置文件中所做的配置。 ' <豆ID = 「sendSmsWSImpl」 類= 「com.XXXXX.SendSmsWebService」> \t <屬性名= 「sendSmsValidation」 REF = 「sendSmsValidation」> <屬性名= 「mtPreProcessorModule」 REF = 「mtPreProcessorModule」> ' – 2011-06-01 22:08:37

2

非同步HashMap的put方法很可能是從多個線程調用的。當有多個線程對HashMap的put方法進行大量調用時,我遇到了同樣的問題。