Thanks Dan: I tried, it's ok now; thanks to your rapid fix;
----- Original Message ----- From: "Daniel Kulp" <dk...@apache.org> To: <users@cxf.apache.org> Cc: "xuhb" <x...@tongtech.com> Sent: Saturday, August 20, 2011 1:21 AM Subject: Re: A mysteriously deadlock of CXF OnewayProcessorInterceptor > > I just committed a fix to trunk (pulling back to 2.4.x now as well). When > you get a chance, can you give it a try to see if it fixes your issue? > Threading things like these are hard to really test. > > Dan > > > On Friday, August 19, 2011 2:32:03 PM xuhb wrote: >> 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.cla >> >> ss) > .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: > > -- > Daniel Kulp > dk...@apache.org > http://dankulp.com/blog > Talend - http://www.talend.com >