Maybe it is becuase before chain.wait() return, the sync of chain will be re-locked, so it will block untill chain.resume() finished;
----- Original Message ----- From: "xuhb" <x...@tongtech.com> To: <users@cxf.apache.org> Sent: Friday, August 19, 2011 1:39 PM Subject: Re: A mysteriously deadlock of CXF OnewayProcessorInterceptor > 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: >>