Sorry, I foget post the issue link: https://issues.apache.org/jira/browse/CXF-3750
----- Original Message ----- From: "xuhb" <x...@tongtech.com> To: <users@cxf.apache.org> Sent: Friday, August 19, 2011 1:34 PM Subject: A mysteriously deadlock of CXF OnewayProcessorInterceptor > Hi: > Recently when I am checking/testing CXF , there is a mysteriously deadlock > of CXF Oneway Process; Normally CXF engine will invoke the one way > bussiness logical asynchronized ,, so the servlet handle will finished and > return back to servlet engine immediately; > > But sometime, I noticed that the servlet handle(JettyHTTPHandler) at > server side doesn't return back to servlet engine(Jetty) immediately , it > will waiting until the asynchrouse business logical finished; > After dig source of CXF, I find it 's relate to > OnewayProcessorInterceptor;But until now I can only show when will the > deadlock occurs, but I still can not explain why; > > Following is details: > OnewayProcessInterceptor.handleMessage{ > synchronized (chain) { > message.getExchange().get(Bus.class).getExtension(WorkQueueManager.class) > .getAutomaticWorkQueue().execute(new Runnable() { > public void run() { > synchronized (chain) { > System.out.println("--notify all"); > chain.notifyAll(); > } > > chain.resume(); //if chain.resume is called before chain.wait finished , > the dead lock will occurs; It seems as chain.resume is synchronized, so it > will relock on chain object, so the chain.wait() will deadlocked (... I feel > confused for this, because jdk doesn't say so...) ;After chain.resume > finished, locking on chain is released, deadlock of chain.wait() is also > released; but I don't think this is problem of CXF , maybe it's jdk's > problem ?? I feels confused; > } > }); > System.out.println("--wait begin"); > chain.wait(20); > System.out.println("--wait end"); > } > } > syncrhonized PhaseInterceptorChain.resume(){ > System.out.println("--api chain resume"); > ... > } > > if the execute sequence as following, every thing is ok. there is no dead > lock; > chain.wait enter > chian.notify invoked > chain.wait return; > chain.resume(); //resume also synchronzed on chain object; > > if the execute sequence as following , dead lock will occurs: > chain.wait enter > chain.notify > chain.resume// ..now waiting on chain will blocked until chain.resume > finished(release sync on chain) > chain.wait return; > > following dump on console indicate the above sequence: > > No DeadLock dump : > --wait begin > --notify all > --wait end > --api chain resume > product service begin Fri Aug 19 12:10:28 CST 2011 //a lone time(10 seconds) > one way business logical begin > product service end Fri Aug 19 12:10:38 CST 2011 .//a lone time(10 > seconds) one way business logical end; > > > DeadLock Dump: > --wait begin > --notify all > --api chain resume > product service begin Fri Aug 19 12:10:40 CST 2011 > product service end Fri Aug 19 12:10:50 CST 2011 > --wait end > > > Until now I am not sure if problem is CXF's or JDK's, or something which I > don't know cause such a deadlock; > I also wrote a simple program to simulate the execute sequnce which > causeddead lock in CXF, but the simple program never dead lock; > > I tried CXF 2.3.3 version && Jetty transport && (JDK1.5_22 || JDK 1.6_17) && > Windows XP system; > > I also post this question as a JIRA issue: >